crossync 0.1.2

A fast concurrent programming suite for Rust.
Documentation
use core::sync::atomic::AtomicUsize;
use std::sync::atomic::AtomicU32;

#[inline]
pub fn wait(a: &AtomicUsize, expected: usize) {
    let ptr: *const AtomicU32 = (a as *const AtomicUsize) as *const AtomicU32;
    let expected_ptr: *const u32 = &(expected as u32);

    unsafe {
        libc::syscall(
            libc::SYS_futex,
            ptr,
            libc::FUTEX_WAIT | libc::FUTEX_PRIVATE_FLAG,
            expected_ptr,
            0u32,
        );
    };
}

#[inline]
pub fn wake_one(ptr: *const AtomicUsize) {
    unsafe {
        libc::syscall(
            libc::SYS_futex,
            ptr as *const AtomicU32,
            libc::FUTEX_WAKE | libc::FUTEX_PRIVATE_FLAG,
            1u32,
        );
    };
}

#[inline]
pub fn wake_all(ptr: *const AtomicUsize) {
    unsafe {
        libc::syscall(
            libc::SYS_futex,
            ptr as *const AtomicU32,
            libc::FUTEX_WAKE | libc::FUTEX_PRIVATE_FLAG,
            u32::MAX,
        );
    };
}