rustix/thread/
mod.rs
1#[cfg(not(target_os = "redox"))]
4mod clock;
5#[cfg(linux_kernel)]
6pub mod futex;
7#[cfg(linux_kernel)]
8mod id;
9#[cfg(linux_kernel)]
10mod libcap;
11#[cfg(linux_kernel)]
12mod prctl;
13#[cfg(linux_kernel)]
14mod setns;
15
16#[allow(deprecated)]
17#[cfg(linux_kernel)]
18pub use crate::backend::thread::futex::FutexOperation;
19#[cfg(linux_kernel)]
20pub use crate::thread::futex::{
21 Flags as FutexFlags, OWNER_DIED as FUTEX_OWNER_DIED, WAITERS as FUTEX_WAITERS,
22};
23#[cfg(not(target_os = "redox"))]
24pub use clock::*;
25#[cfg(linux_kernel)]
26pub use id::{
27 gettid, set_thread_gid, set_thread_groups, set_thread_res_gid, set_thread_res_uid,
28 set_thread_uid, Gid, Pid, RawGid, RawPid, RawUid, Uid,
29};
30#[cfg(linux_kernel)]
31pub use libcap::{capabilities, set_capabilities, CapabilityFlags, CapabilitySets};
32#[cfg(linux_kernel)]
33pub use prctl::*;
34#[cfg(linux_kernel)]
35pub use setns::*;
36
37#[cfg(linux_kernel)]
55#[allow(unsafe_code, deprecated)]
56#[inline]
57pub unsafe fn futex(
58 uaddr: *mut u32,
59 op: FutexOperation,
60 flags: FutexFlags,
61 val: u32,
62 utime: *const Timespec,
63 uaddr2: *mut u32,
64 val3: u32,
65) -> crate::io::Result<usize> {
66 use crate::backend::thread::futex::Operation;
67 use crate::backend::thread::syscalls::{futex_timeout, futex_val2};
68 use core::mem::transmute;
69 use core::sync::atomic::AtomicU32;
70 use FutexOperation::*;
71
72 match op {
73 Wait | LockPi | WaitBitset => futex_timeout(
74 uaddr as *const AtomicU32,
75 transmute::<FutexOperation, Operation>(op),
76 flags,
77 val,
78 utime,
79 uaddr2 as *const AtomicU32,
80 val3,
81 ),
82 Wake | Fd | Requeue | CmpRequeue | WakeOp | UnlockPi | TrylockPi => futex_val2(
83 uaddr as *const AtomicU32,
84 transmute::<FutexOperation, Operation>(op),
85 flags,
86 val,
87 utime as usize as u32,
88 uaddr2 as *const AtomicU32,
89 val3,
90 ),
91 }
92}