#[cfg(not(target_env = "musl"))] use crate::errno::Errno; use crate::sys::signal::SigSet; #[cfg(not(target_env = "musl"))] use crate::Result; #[cfg(not(target_env = "musl"))] use std::mem; #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] pub struct UContext { context: libc::ucontext_t, } impl UContext { #[cfg(not(target_env = "musl"))] pub fn get() -> Result { let mut context = mem::MaybeUninit::::uninit(); let res = unsafe { libc::getcontext(context.as_mut_ptr()) }; Errno::result(res).map(|_| unsafe { UContext { context: context.assume_init(), } }) } #[cfg(not(target_env = "musl"))] pub fn set(&self) -> Result<()> { let res = unsafe { libc::setcontext(&self.context as *const libc::ucontext_t) }; Errno::result(res).map(drop) } pub fn sigmask_mut(&mut self) -> &mut SigSet { unsafe { &mut *(&mut self.context.uc_sigmask as *mut libc::sigset_t as *mut SigSet) } } pub fn sigmask(&self) -> &SigSet { unsafe { &*(&self.context.uc_sigmask as *const libc::sigset_t as *const SigSet) } } }