nolock 0.4.1

A collection of Lock-Free Datastructures
Documentation
use std::{cell::RefCell, sync::atomic};

#[cfg(feature = "hazard_ptr")]
use nolock::hazard_ptr;

#[cfg(feature = "hazard_ptr")]
#[test]
#[cfg(not(loom))]
#[ignore = "They dont work currently"]
fn protect_boxed() {
    use std::sync::atomic::AtomicPtr;

    let initial_ptr = Box::into_raw(Box::new(RefCell::new(false)));
    let atom_ptr = AtomicPtr::new(initial_ptr);

    let global = hazard_ptr::get_global_domain();

    let guard = global.protect(&atom_ptr, atomic::Ordering::SeqCst);

    unsafe {
        global.retire(initial_ptr, |ptr| {
            let ref_cell = unsafe { &*ptr };

            *ref_cell.borrow_mut() = true;
        });
    }

    global.reclaim();

    assert_eq!(false, *guard.borrow());

    drop(guard);

    global.reclaim();

    let initial_refcell = unsafe { &*initial_ptr };
    assert_eq!(true, *initial_refcell.borrow());
}