2019-05-14 10:27:36 -07:00
|
|
|
#![deny(warnings, rust_2018_idioms)]
|
2019-02-20 14:07:53 -08:00
|
|
|
|
2019-01-22 11:37:26 -08:00
|
|
|
#[macro_use]
|
|
|
|
|
extern crate loom;
|
|
|
|
|
|
2019-02-20 14:07:53 -08:00
|
|
|
#[allow(dead_code)]
|
2019-06-24 12:34:30 -07:00
|
|
|
#[path = "../src/task/atomic_waker.rs"]
|
|
|
|
|
mod atomic_waker;
|
|
|
|
|
use crate::atomic_waker::AtomicWaker;
|
2019-01-22 11:37:26 -08:00
|
|
|
|
2019-06-24 12:34:30 -07:00
|
|
|
use async_util::future::poll_fn;
|
2019-01-22 11:37:26 -08:00
|
|
|
use loom::futures::block_on;
|
|
|
|
|
use loom::sync::atomic::AtomicUsize;
|
|
|
|
|
use loom::thread;
|
|
|
|
|
use std::sync::atomic::Ordering::Relaxed;
|
2019-02-21 11:56:15 -08:00
|
|
|
use std::sync::Arc;
|
2019-06-24 12:34:30 -07:00
|
|
|
use std::task::Poll::{Pending, Ready};
|
2019-01-22 11:37:26 -08:00
|
|
|
|
|
|
|
|
struct Chan {
|
|
|
|
|
num: AtomicUsize,
|
2019-06-24 12:34:30 -07:00
|
|
|
task: AtomicWaker,
|
2019-01-22 11:37:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn basic_notification() {
|
|
|
|
|
const NUM_NOTIFY: usize = 2;
|
|
|
|
|
|
|
|
|
|
loom::fuzz(|| {
|
|
|
|
|
let chan = Arc::new(Chan {
|
|
|
|
|
num: AtomicUsize::new(0),
|
2019-06-24 12:34:30 -07:00
|
|
|
task: AtomicWaker::new(),
|
2019-01-22 11:37:26 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
for _ in 0..NUM_NOTIFY {
|
|
|
|
|
let chan = chan.clone();
|
|
|
|
|
|
|
|
|
|
thread::spawn(move || {
|
|
|
|
|
chan.num.fetch_add(1, Relaxed);
|
2019-06-24 12:34:30 -07:00
|
|
|
chan.task.wake();
|
2019-01-22 11:37:26 -08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-24 12:34:30 -07:00
|
|
|
block_on(poll_fn(move |cx| {
|
|
|
|
|
chan.task.register_by_ref(cx.waker());
|
2019-01-22 11:37:26 -08:00
|
|
|
|
|
|
|
|
if NUM_NOTIFY == chan.num.load(Relaxed) {
|
2019-06-24 12:34:30 -07:00
|
|
|
return Ready(());
|
2019-01-22 11:37:26 -08:00
|
|
|
}
|
|
|
|
|
|
2019-06-24 12:34:30 -07:00
|
|
|
Pending
|
|
|
|
|
}));
|
2019-01-22 11:37:26 -08:00
|
|
|
});
|
|
|
|
|
}
|