1#[cfg(not(target_env = "musl"))]
2use crate::errno::Errno;
3use crate::sys::signal::SigSet;
4#[cfg(not(target_env = "musl"))]
5use crate::Result;
6#[cfg(not(target_env = "musl"))]
7use std::mem;
8
9#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
10pub struct UContext {
11 context: libc::ucontext_t,
12}
13
14impl UContext {
15 #[cfg(not(target_env = "musl"))]
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 {
21 context: context.assume_init(),
22 }
23 })
24 }
25
26 #[cfg(not(target_env = "musl"))]
27 pub fn set(&self) -> Result<()> {
28 let res = unsafe {
29 libc::setcontext(&self.context as *const libc::ucontext_t)
30 };
31 Errno::result(res).map(drop)
32 }
33
34 pub fn sigmask_mut(&mut self) -> &mut SigSet {
35 unsafe {
36 &mut *(&mut self.context.uc_sigmask as *mut libc::sigset_t
37 as *mut SigSet)
38 }
39 }
40
41 pub fn sigmask(&self) -> &SigSet {
42 unsafe {
43 &*(&self.context.uc_sigmask as *const libc::sigset_t
44 as *const SigSet)
45 }
46 }
47}