rt/rust/examples/notify.rs

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");
}
}