cee_scape/glibc_compat.rs
1use std::marker::PhantomData;
2
3/// `JmpBufFields` are the accessible fields when viewed via a JmpBuf pointer.
4/// But also: You shouldn't be poking at these!
5#[repr(C)]
6pub struct JmpBufFields {
7 _buf: [u64; 8],
8 _neither_send_nor_sync: PhantomData<*const u8>,
9}
10
11/// `SigJmpBufFields` are the accessible fields when viewed via a SigJmpBuf pointer.
12/// But also: You shouldn't be poking at these!
13#[repr(C)]
14pub struct SigJmpBufFields {
15 // This *must* be the first field. We allow `SigJmpBuf` to be transmuted to
16 // a `JmpBuf` and then back again depending on the host libc. (e.g. glibc
17 // has setjmp as a shallow wrapper around sigsetjmp, and will write to
18 // fields past the `__jmp_buf`).
19 __jmp_buf: JmpBufFields,
20 __mask_was_saved: isize,
21 __saved_mask: libc::sigset_t,
22}
23
24/// This is the type you use to allocate a JmpBuf on the stack.
25/// (Glibc puns the two.)
26pub type JmpBufStruct = SigJmpBufFields;
27
28/// This is the type you use to allocate a SigJmpBuf on the stack.
29pub type SigJmpBufStruct = SigJmpBufFields;