50 lines
1.1 KiB
Rust
50 lines
1.1 KiB
Rust
use core::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
const N: i32 = 10;
|
|
rt::notify!(NOTE);
|
|
|
|
fn notifier() {
|
|
rt::task::drop_privilege();
|
|
for _ in 0..N {
|
|
rt::task::sleep(5);
|
|
NOTE.or(1);
|
|
}
|
|
|
|
rt::task::sleep(15);
|
|
NOTE.post();
|
|
}
|
|
|
|
static WAIT_FAILED: AtomicBool = AtomicBool::new(false);
|
|
static WRONG_VALUE: AtomicBool = AtomicBool::new(false);
|
|
|
|
fn waiter() {
|
|
rt::task::drop_privilege();
|
|
for _ in 0..N {
|
|
match NOTE.timed_wait_clear(1, 10) {
|
|
Some(v) if v != 1 => WRONG_VALUE.store(true, Ordering::Relaxed),
|
|
None => WAIT_FAILED.store(true, Ordering::Relaxed),
|
|
_ => (),
|
|
};
|
|
}
|
|
|
|
if NOTE.timed_wait(10).is_some() {
|
|
WAIT_FAILED.store(true, Ordering::Relaxed);
|
|
}
|
|
|
|
rt::stop();
|
|
}
|
|
|
|
fn main() {
|
|
rt::task!(notifier, rt::task::STACK_MIN, 1);
|
|
rt::task!(waiter, rt::task::STACK_MIN, 1);
|
|
rt::start();
|
|
|
|
if WAIT_FAILED.load(Ordering::Relaxed) {
|
|
panic!("notify wait failed");
|
|
}
|
|
|
|
if WRONG_VALUE.load(Ordering::Relaxed) {
|
|
panic!("notify wait returned the wrong value");
|
|
}
|
|
}
|