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