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