maillon 0.1.0

A concurrent intrusive list for building synchronization primitives.
Documentation
#[cfg(not(loom))]
pub(crate) use core::cell;

#[cfg(loom)]
pub(crate) use loom::{cell, sync};
#[cfg(not(loom))]
pub(crate) mod sync {
    #[cfg(not(feature = "portable-atomic"))]
    pub(crate) use core::sync::atomic;
    #[cfg(feature = "std")]
    pub(crate) use std::sync::{Condvar, Mutex, MutexGuard};

    #[cfg(feature = "portable-atomic")]
    pub(crate) use portable_atomic as atomic;
}

pub trait AtomicPtrExt<T> {
    fn load_mut(&mut self) -> *mut T;
    fn store_mut(&mut self, ptr: *mut T);
}

impl<T> AtomicPtrExt<T> for sync::atomic::AtomicPtr<T> {
    fn load_mut(&mut self) -> *mut T {
        #[cfg(not(loom))]
        return *self.get_mut();
        #[cfg(loom)]
        return self.with_mut(|ptr| *ptr);
    }

    fn store_mut(&mut self, ptr: *mut T) {
        #[cfg(not(loom))]
        let () = *self.get_mut() = ptr;
        #[cfg(loom)]
        return self.with_mut(|p| *p = ptr);
    }
}