rustix/backend/libc/thread/
futex.rs

1use crate::backend::c;
2
3bitflags::bitflags! {
4    /// `FUTEX_*` flags for use with the functions in [`futex`].
5    ///
6    /// [`futex`]: mod@crate::thread::futex
7    #[repr(transparent)]
8    #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
9    pub struct Flags: u32 {
10        /// `FUTEX_PRIVATE_FLAG`
11        const PRIVATE = bitcast!(c::FUTEX_PRIVATE_FLAG);
12        /// `FUTEX_CLOCK_REALTIME`
13        const CLOCK_REALTIME = bitcast!(c::FUTEX_CLOCK_REALTIME);
14
15        /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
16        const _ = !0;
17    }
18}
19
20bitflags::bitflags! {
21    /// `FUTEX2_*` flags for use with the functions in [`Waitv`].
22    ///
23    /// Not to be confused with [`WaitvFlags`], which is passed as an argument
24    /// to the `waitv` function.
25    ///
26    /// [`Waitv`]: crate::thread::futex::Waitv
27    /// [`WaitvFlags`]: crate::thread::futex::WaitvFlags
28    #[repr(transparent)]
29    #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
30    pub struct WaitFlags: u32 {
31        /// `FUTEX_U8`
32        const SIZE_U8 = linux_raw_sys::general::FUTEX2_SIZE_U8;
33        /// `FUTEX_U16`
34        const SIZE_U16 = linux_raw_sys::general::FUTEX2_SIZE_U16;
35        /// `FUTEX_U32`
36        const SIZE_U32 = linux_raw_sys::general::FUTEX2_SIZE_U32;
37        /// `FUTEX_U64`
38        const SIZE_U64 = linux_raw_sys::general::FUTEX2_SIZE_U64;
39        /// `FUTEX_SIZE_MASK`
40        const SIZE_MASK = linux_raw_sys::general::FUTEX2_SIZE_MASK;
41
42        /// `FUTEX2_NUMA`
43        const NUMA = linux_raw_sys::general::FUTEX2_NUMA;
44
45        /// `FUTEX2_PRIVATE`
46        const PRIVATE = linux_raw_sys::general::FUTEX2_PRIVATE;
47
48        /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
49        const _ = !0;
50    }
51}
52
53/// `FUTEX_*` operations for use with the futex syscall wrappers.
54#[derive(Debug, Copy, Clone, Eq, PartialEq)]
55#[repr(u32)]
56pub(crate) enum Operation {
57    /// `FUTEX_WAIT`
58    Wait = bitcast!(c::FUTEX_WAIT),
59    /// `FUTEX_WAKE`
60    Wake = bitcast!(c::FUTEX_WAKE),
61    /// `FUTEX_FD`
62    Fd = bitcast!(c::FUTEX_FD),
63    /// `FUTEX_REQUEUE`
64    Requeue = bitcast!(c::FUTEX_REQUEUE),
65    /// `FUTEX_CMP_REQUEUE`
66    CmpRequeue = bitcast!(c::FUTEX_CMP_REQUEUE),
67    /// `FUTEX_WAKE_OP`
68    WakeOp = bitcast!(c::FUTEX_WAKE_OP),
69    /// `FUTEX_LOCK_PI`
70    LockPi = bitcast!(c::FUTEX_LOCK_PI),
71    /// `FUTEX_UNLOCK_PI`
72    UnlockPi = bitcast!(c::FUTEX_UNLOCK_PI),
73    /// `FUTEX_TRYLOCK_PI`
74    TrylockPi = bitcast!(c::FUTEX_TRYLOCK_PI),
75    /// `FUTEX_WAIT_BITSET`
76    WaitBitset = bitcast!(c::FUTEX_WAIT_BITSET),
77    /// `FUTEX_WAKE_BITSET`
78    WakeBitset = bitcast!(c::FUTEX_WAKE_BITSET),
79    /// `FUTEX_WAIT_REQUEUE_PI`
80    WaitRequeuePi = bitcast!(c::FUTEX_WAIT_REQUEUE_PI),
81    /// `FUTEX_CMP_REQUEUE_PI`
82    CmpRequeuePi = bitcast!(c::FUTEX_CMP_REQUEUE_PI),
83    /// `FUTEX_LOCK_PI2`
84    LockPi2 = bitcast!(c::FUTEX_LOCK_PI2),
85}
86
87/// `FUTEX_WAITERS`
88pub const WAITERS: u32 = linux_raw_sys::general::FUTEX_WAITERS;
89
90/// `FUTEX_OWNER_DIED`
91pub const OWNER_DIED: u32 = linux_raw_sys::general::FUTEX_OWNER_DIED;