rt/rust/examples/semaphore.rs

41 lines
807 B
Rust

use core::sync::atomic::{AtomicBool, Ordering};
const N: i32 = 10;
rt::semaphore!(SEM);
fn poster() {
rt::task::drop_privilege();
for _ in 0..N {
rt::task::sleep(5);
SEM.post();
}
rt::task::sleep(15);
SEM.post();
}
static WAIT_FAILED: AtomicBool = AtomicBool::new(false);
fn waiter() {
rt::task::drop_privilege();
for _ in 0..N {
if !SEM.timed_wait(10) {
WAIT_FAILED.store(true, Ordering::Relaxed);
}
}
if SEM.timed_wait(10) {
WAIT_FAILED.store(true, Ordering::Relaxed);
}
rt::stop();
}
fn main() {
rt::task!(poster, rt::task::STACK_MIN, 1);
rt::task!(waiter, rt::task::STACK_MIN, 1);
rt::start();
if WAIT_FAILED.load(Ordering::Relaxed) {
panic!("semaphore wait failed");
}
}