#![deny(warnings, rust_2018_idioms)]
use loom::sync::atomic::AtomicUsize;
use loom::thread;
use std::sync::atomic::Ordering::{AcqRel, Acquire, Relaxed, Release};
use std::sync::Arc;
#[test]
#[should_panic]
fn invalid_unsync_load_relaxed() {
loom::model(|| {
let a = Arc::new(AtomicUsize::new(0));
let b = a.clone();
let thread = thread::spawn(move || {
unsafe { a.unsync_load() };
});
b.store(1, Relaxed);
thread.join().unwrap();
});
}
#[test]
#[ignore]
#[should_panic]
fn compare_and_swap_reads_old_values() {
loom::model(|| {
let a = Arc::new(AtomicUsize::new(0));
let b = Arc::new(AtomicUsize::new(0));
let a2 = a.clone();
let b2 = b.clone();
let th = thread::spawn(move || {
a2.store(1, Release);
b2.compare_and_swap(0, 2, AcqRel);
});
b.store(1, Release);
a.compare_and_swap(0, 2, AcqRel);
th.join().unwrap();
let a_val = a.load(Acquire);
let b_val = b.load(Acquire);
if a_val == 2 && b_val == 2 {
panic!();
}
});
}