[go: up one dir, main page]

sdd 1.6.0

Scalable lock-free delayed memory reclaimer
Documentation
#[cfg(all(loom, test))]
mod test_model {
    use crate::{prepare, Guard, Shared};
    use std::sync::atomic::AtomicBool;
    use std::sync::atomic::Ordering::Relaxed;
    use std::sync::Arc;

    struct A(Arc<AtomicBool>);
    impl Drop for A {
        fn drop(&mut self) {
            self.0.swap(true, Relaxed);
        }
    }

    #[test]
    fn ebr() {
        loom::model(|| {
            prepare();

            let flag = Arc::new(AtomicBool::new(false));
            let data = Shared::new(A(flag.clone()));
            let data_clone = data.clone();

            let thread = loom::thread::spawn(move || {
                let guard = Guard::new();
                let ptr = data_clone.get_guarded_ptr(&guard);
                drop(data_clone);
                assert!(!ptr.as_ref().unwrap().0.load(Relaxed));
            });

            let guard = Guard::new();
            let ptr = data.get_guarded_ptr(&guard);
            drop(data);

            assert!(!ptr.as_ref().unwrap().0.load(Relaxed));
            drop(guard);

            assert!(thread.join().is_ok());
        });
    }
}