mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-09-25 12:00:35 +00:00
72 lines
1.5 KiB
Rust
72 lines
1.5 KiB
Rust
#![deny(warnings, rust_2018_idioms)]
|
|
|
|
#[macro_use]
|
|
extern crate loom;
|
|
|
|
macro_rules! if_fuzz {
|
|
($($t:tt)*) => {
|
|
$($t)*
|
|
}
|
|
}
|
|
|
|
#[path = "../src/mpsc/list.rs"]
|
|
#[allow(warnings)]
|
|
mod list;
|
|
|
|
#[path = "../src/mpsc/block.rs"]
|
|
#[allow(warnings)]
|
|
mod block;
|
|
|
|
const BLOCK_CAP: usize = 2;
|
|
|
|
use loom::thread;
|
|
use std::sync::Arc;
|
|
|
|
#[test]
|
|
fn smoke() {
|
|
use crate::block::Read::*;
|
|
|
|
const NUM_TX: usize = 2;
|
|
const NUM_MSG: usize = 2;
|
|
|
|
loom::model(|| {
|
|
let (tx, mut rx) = list::channel();
|
|
let tx = Arc::new(tx);
|
|
|
|
for th in 0..NUM_TX {
|
|
let tx = tx.clone();
|
|
|
|
thread::spawn(move || {
|
|
for i in 0..NUM_MSG {
|
|
tx.push((th, i));
|
|
}
|
|
debug!(" + tx thread done");
|
|
});
|
|
}
|
|
|
|
let mut next = vec![0; NUM_TX];
|
|
|
|
loop {
|
|
debug!(" + rx.pop()");
|
|
match rx.pop(&tx) {
|
|
Some(Value((th, v))) => {
|
|
debug!(" + pop() -> Some(Value({}))", v);
|
|
assert_eq!(v, next[th]);
|
|
next[th] += 1;
|
|
|
|
if next.iter().all(|&i| i == NUM_MSG) {
|
|
break;
|
|
}
|
|
}
|
|
Some(Closed) => {
|
|
panic!();
|
|
}
|
|
None => {
|
|
debug!(" + pop() -> None");
|
|
thread::yield_now();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|