45 lines
955 B
Rust
45 lines
955 B
Rust
#![deny(warnings, rust_2018_idioms)]
|
|
|
|
use loom::sync::atomic::AtomicUsize;
|
|
use loom::thread;
|
|
|
|
use std::sync::atomic::Ordering::{Acquire, Relaxed, Release};
|
|
use std::sync::Arc;
|
|
|
|
#[test]
|
|
#[should_panic]
|
|
fn checks_fail() {
|
|
struct BuggyInc {
|
|
num: AtomicUsize,
|
|
}
|
|
|
|
impl BuggyInc {
|
|
fn new() -> BuggyInc {
|
|
BuggyInc {
|
|
num: AtomicUsize::new(0),
|
|
}
|
|
}
|
|
|
|
fn inc(&self) {
|
|
let curr = self.num.load(Acquire);
|
|
self.num.store(curr + 1, Release);
|
|
}
|
|
}
|
|
|
|
loom::model(|| {
|
|
let buggy_inc = Arc::new(BuggyInc::new());
|
|
|
|
let ths: Vec<_> = (0..2)
|
|
.map(|_| {
|
|
let buggy_inc = buggy_inc.clone();
|
|
thread::spawn(move || buggy_inc.inc())
|
|
})
|
|
.collect();
|
|
|
|
for th in ths {
|
|
th.join().unwrap();
|
|
}
|
|
|
|
assert_eq!(2, buggy_inc.num.load(Relaxed));
|
|
});
|
|
}
|