• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #[cfg(not(target_env = "musl"))]
2 use crate::Result;
3 #[cfg(not(target_env = "musl"))]
4 use crate::errno::Errno;
5 #[cfg(not(target_env = "musl"))]
6 use std::mem;
7 use crate::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 = mem::MaybeUninit::<libc::ucontext_t>::uninit();
18         let res = unsafe { libc::getcontext(context.as_mut_ptr()) };
19         Errno::result(res).map(|_| unsafe {
20             UContext { context: context.assume_init()}
21         })
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 {
34             &mut *(&mut self.context.uc_sigmask as *mut libc::sigset_t as *mut SigSet)
35         }
36     }
37 
sigmask(&self) -> &SigSet38     pub fn sigmask(&self) -> &SigSet {
39         unsafe {
40             &*(&self.context.uc_sigmask as *const libc::sigset_t as *const SigSet)
41         }
42     }
43 }
44