in quic/s2n-quic-core/src/sync/worker.rs [147:185]
fn loom_scenario(iterations: usize, send_batch_size: usize, recv_batch_size: usize) {
assert_ne!(send_batch_size, 0);
assert_ne!(recv_batch_size, 0);
loom::model(move || {
let (send, mut recv) = channel();
let sender = loom::thread::spawn(move || {
for _ in 0..iterations {
send.submit(send_batch_size);
loom::hint::spin_loop();
}
});
let receiver = loom::thread::spawn(move || {
loom::future::block_on(async move {
let mut total = 0;
while let Some(mut count) = recv.acquire().await {
assert_ne!(count, 0);
while count > 0 {
let to_finish = count.min(recv_batch_size);
recv.finish(to_finish);
total += to_finish;
count -= to_finish;
}
}
assert_eq!(total, iterations * send_batch_size);
})
});
// loom tests will still run after returning so we don't need to join
if cfg!(not(loom)) {
sender.join().unwrap();
receiver.join().unwrap();
}
});
}