1#[cfg(not(target_env = "musl"))]
2use crate::Result;
3#[cfg(not(target_env = "musl"))]
4use crate::errno::Errno;
5#[cfg(not(target_env = "musl"))]
6use std::mem;
7use crate::sys::signal::SigSet;
8
9#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
10pub struct UContext {
11 context: libc::ucontext_t,
12}
13
14impl UContext {
15 #[cfg(not(target_env = "musl"))]
16 pub fn get() -> Result<UContext> {
17 let mut context = mem::MaybeUninit::<libc::ucontext_t>::uninit();
18 let res = unsafe { libc::getcontext(context.as_mut_ptr()) };
19 Errno::result(res).map(|_| unsafe {
20 UContext { context: context.assume_init()}
21 })
22 }
23
24 #[cfg(not(target_env = "musl"))]
25 pub fn set(&self) -> Result<()> {
26 let res = unsafe {
27 libc::setcontext(&self.context as *const libc::ucontext_t)
28 };
29 Errno::result(res).map(drop)
30 }
31
32 pub fn sigmask_mut(&mut self) -> &mut SigSet {
33 unsafe {
34 &mut *(&mut self.context.uc_sigmask as *mut libc::sigset_t as *mut SigSet)
35 }
36 }
37
38 pub fn sigmask(&self) -> &SigSet {
39 unsafe {
40 &*(&self.context.uc_sigmask as *const libc::sigset_t as *const SigSet)
41 }
42 }
43}