#![cfg(loom)]
use lf_queue::Queue;
use loom::thread;
#[test]
fn test_mpsc() {
loom::model(|| {
const COUNT: usize = 5;
let queue: Queue<usize> = Queue::new();
let q1 = queue.clone();
let th1 = thread::spawn(move || {
for i in 0..3 {
q1.push(i);
}
});
let q2 = queue.clone();
let th2 = thread::spawn(move || {
for i in 3..5 {
q2.push(i);
}
});
th1.join().unwrap();
th2.join().unwrap();
for _ in 0..COUNT {
assert!(queue.pop().is_some());
}
});
}
#[test]
fn test_spmc() {
loom::model(|| {
const COUNT: usize = 5;
let queue: Queue<usize> = Queue::new();
for i in 0..COUNT {
queue.push(i);
}
let mut n = 0;
let q1 = queue.clone();
let th1 = thread::spawn(move || {
let mut x = 0;
while q1.pop().is_some() {
x += 1;
}
x
});
let q2 = queue.clone();
let th2 = thread::spawn(move || {
let mut x = 0;
while q2.pop().is_some() {
x += 1;
}
x
});
n += th1.join().unwrap();
n += th2.join().unwrap();
assert_eq!(n, COUNT);
});
}
#[test]
fn test_concurrent_push_and_pop() {
loom::model(|| {
const COUNT: usize = 5;
let queue: Queue<usize> = Queue::new();
let q1 = queue.clone();
let th1 = thread::spawn(move || {
for i in 0..COUNT {
q1.push(i);
}
});
let q2 = queue.clone();
let th2 = thread::spawn(move || {
for _ in 0..COUNT {
loop {
if q2.pop().is_some() {
break;
} else {
thread::yield_now()
}
}
}
});
th1.join().unwrap();
th2.join().unwrap();
});
}