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