#![cfg(feature = "loom")]
use loom::sync::Arc;
use loom::sync::atomic::{AtomicUsize, Ordering};
use loom::thread;
use smallring::atomic::AtomicRingBuf;
#[test]
fn test_atomic_queue_mpsc_loom() {
loom::model(|| {
let buf = Arc::new(AtomicRingBuf::<AtomicUsize, 4, false>::new(4));
let buf1 = buf.clone();
let buf2 = buf.clone();
let t1 = thread::spawn(move || {
buf1.push(1, Ordering::Relaxed).unwrap();
buf1.push(2, Ordering::Relaxed).unwrap();
});
let t2 = thread::spawn(move || {
buf2.push(3, Ordering::Relaxed).unwrap();
buf2.push(4, Ordering::Relaxed).unwrap();
});
let t3 = thread::spawn(move || {
let mut received = 0;
let mut sum = 0;
while received < 4 {
if let Some(val) = buf.pop(Ordering::Relaxed) {
received += 1;
sum += val;
} else {
thread::yield_now();
}
}
assert_eq!(sum, 10);
});
t1.join().unwrap();
t2.join().unwrap();
t3.join().unwrap();
});
}
#[test]
fn test_atomic_queue_overwrite_loom() {
loom::model(|| {
let buf = Arc::new(AtomicRingBuf::<AtomicUsize, 4, true>::new(1));
let producer = buf.clone();
thread::spawn(move || {
producer.push(10, Ordering::Relaxed);
producer.push(20, Ordering::Relaxed); });
});
}