loom 0.2.0

Permutation testing for concurrent code
Documentation
#![deny(warnings, rust_2018_idioms)]

use loom;

use loom::sync::atomic::AtomicUsize;
use loom::sync::{Condvar, Mutex};
use loom::thread;

use std::sync::atomic::Ordering::SeqCst;
use std::sync::Arc;

#[test]
fn condvar() {
    struct Inc {
        num: AtomicUsize,
        mutex: Mutex<()>,
        condvar: Condvar,
    }

    impl Inc {
        fn new() -> Inc {
            Inc {
                num: AtomicUsize::new(0),
                mutex: Mutex::new(()),
                condvar: Condvar::new(),
            }
        }

        fn inc(&self) {
            self.num.store(1, SeqCst);
            drop(self.mutex.lock().unwrap());
            self.condvar.notify_one();
        }
    }

    loom::model(|| {
        let inc = Arc::new(Inc::new());

        for _ in 0..1 {
            let inc = inc.clone();
            thread::spawn(move || inc.inc());
        }

        let mut guard = inc.mutex.lock().unwrap();

        loop {
            let val = inc.num.load(SeqCst);
            if 1 == val {
                break;
            }

            guard = inc.condvar.wait(guard).unwrap();
        }
    });
}