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