]> git.lizzy.rs Git - rust.git/blob - library/std/src/sys/hermit/futex.rs
Rollup merge of #105362 - WaffleLapkin:🙅, r=oli-obk
[rust.git] / library / std / src / sys / hermit / futex.rs
1 use super::abi;
2 use crate::ptr::null;
3 use crate::sync::atomic::AtomicU32;
4 use crate::time::Duration;
5
6 pub fn futex_wait(futex: &AtomicU32, expected: u32, timeout: Option<Duration>) -> bool {
7     // Calculate the timeout as a relative timespec.
8     //
9     // Overflows are rounded up to an infinite timeout (None).
10     let timespec = timeout.and_then(|dur| {
11         Some(abi::timespec {
12             tv_sec: dur.as_secs().try_into().ok()?,
13             tv_nsec: dur.subsec_nanos().into(),
14         })
15     });
16
17     let r = unsafe {
18         abi::futex_wait(
19             futex.as_mut_ptr(),
20             expected,
21             timespec.as_ref().map_or(null(), |t| t as *const abi::timespec),
22             abi::FUTEX_RELATIVE_TIMEOUT,
23         )
24     };
25
26     r != -abi::errno::ETIMEDOUT
27 }
28
29 #[inline]
30 pub fn futex_wake(futex: &AtomicU32) -> bool {
31     unsafe { abi::futex_wake(futex.as_mut_ptr(), 1) > 0 }
32 }
33
34 #[inline]
35 pub fn futex_wake_all(futex: &AtomicU32) {
36     unsafe {
37         abi::futex_wake(futex.as_mut_ptr(), i32::MAX);
38     }
39 }