#[cfg(not(teksilo_loom))]
pub use std::sync::atomic::{
AtomicBool, AtomicU8, AtomicU32, AtomicU64, AtomicUsize, Ordering, fence,
};
#[cfg(not(teksilo_loom))]
pub use std::sync::{Arc, Condvar, Mutex, MutexGuard};
#[cfg(teksilo_loom)]
pub use loom::sync::atomic::{
AtomicBool, AtomicU8, AtomicU32, AtomicU64, AtomicUsize, Ordering, fence,
};
#[cfg(teksilo_loom)]
pub use loom::sync::{Arc, Condvar, Mutex, MutexGuard};
#[cfg(teksilo_loom)]
pub use loom::thread_local;
#[cfg(teksilo_loom)]
pub use loom::model;
#[cfg(teksilo_loom)]
pub use loom::thread;
#[cfg(all(test, teksilo_loom))]
mod loom_tests {
use super::{Arc, AtomicBool, Ordering, model, thread};
use std::sync::atomic::AtomicUsize as StdCounter;
#[test]
fn loom_explores_more_than_one_interleaving() {
static RUNS: StdCounter = StdCounter::new(0);
model(|| {
RUNS.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
let flag = Arc::new(AtomicBool::new(false));
let writer = {
let flag = flag.clone();
thread::spawn(move || flag.store(true, Ordering::Release))
};
let _ = flag.load(Ordering::Acquire);
writer.join().unwrap();
});
assert!(
RUNS.load(std::sync::atomic::Ordering::Relaxed) > 1,
"loom ran the model once: it explored no interleaving"
);
}
}