1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
use libc; #[cfg(not(target_env = "musl"))] use Result; #[cfg(not(target_env = "musl"))] use errno::Errno; use std::mem; use sys::signal::SigSet; #[derive(Clone, Copy)] #[allow(missing_debug_implementations)] pub struct UContext { context: libc::ucontext_t, } impl UContext { #[cfg(not(target_env = "musl"))] pub fn get() -> Result<UContext> { let mut context: libc::ucontext_t = unsafe { mem::uninitialized() }; let res = unsafe { libc::getcontext(&mut context as *mut libc::ucontext_t) }; Errno::result(res).map(|_| UContext { context: context }) } #[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 { mem::transmute(&mut self.context.uc_sigmask) } } pub fn sigmask(&self) -> &SigSet { unsafe { mem::transmute(&self.context.uc_sigmask) } } }