wait_on_address
Cross platform atomic wait and wake (aka futex) functionality. This crate is a fork of atomic-wait, and extends the original code with the following functionality:
- Support for
AtomicI32,AtomicI64, andAtomicU64 - Support for waiting with a timeout
- Support for
wasm32on nightly usingstd::arch - Polyfill for all other platforms
Natively-supported platforms:
- Windows 8+, Windows Server 2012+
- macOS 14.4+, iOS 17.4+, watchOS 10.4+
- Linux 2.6.22+ (using fallback for 64-bit futexes)
- wasm32
- All other platforms with
stdsupport (using fallback)
Usage
use ;
use AtomicWait;
let a = new;
a.wait; // If the value is 1, wait.
a.wait_timeout; // If the value is 2, wait at most 100 milliseconds
a.notify_one; // Wake one waiting thread.
a.notify_all; // Wake all waiting threads.
Implementation
On Linux, this uses the SYS_futex syscall.
On FreeBSD, this uses the _umtx_op syscall.
On Windows, this uses the WaitOnAddress and WakeByAddress APIs.
On macOS (and iOS and watchOS), this uses the os_sync_wait_on_address and os_sync_wake_by_address APIs.
On wasm32 with nightly, this uses memory_atomic_wait32, memory_atomic_wait64, and memory_atomic_notify instructions.
All other platforms with std support fall back to a fixed-size hashmap of Condvars, similar to libstdc++'s implementation for std::atomic<T>.