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