atomic-wait 1.1.0

Cross-platform atomic wait and wake (aka futex) functionality.
Documentation
use atomic_wait::{wait, wake_all, wake_one};
use std::{
    sync::atomic::{AtomicU32, Ordering::Relaxed},
    thread::sleep,
    time::{Duration, Instant},
};

#[test]
fn wake_null() {
    wake_one(std::ptr::null::<AtomicU32>());
    wake_all(std::ptr::null::<AtomicU32>());
}

#[test]
fn wake_nothing() {
    let a = AtomicU32::new(0);
    wake_one(&a);
    wake_all(&a);
}

#[test]
fn wait_unexpected() {
    let t = Instant::now();
    let a = AtomicU32::new(0);
    wait(&a, 1);
    assert!(t.elapsed().as_millis() < 100);
}

#[test]
fn wait_wake() {
    let t = Instant::now();
    let a = AtomicU32::new(0);
    std::thread::scope(|s| {
        s.spawn(|| {
            sleep(Duration::from_millis(100));
            a.store(1, Relaxed);
            wake_one(&a);
        });
        while a.load(Relaxed) == 0 {
            wait(&a, 0);
        }
        assert_eq!(a.load(Relaxed), 1);
        assert!((90..400).contains(&t.elapsed().as_millis()));
    });
}