rt/rust/examples/once.rs

35 lines
593 B
Rust

#![no_main]
use core::sync::atomic::{AtomicUsize, Ordering};
const ITERATIONS: usize = 100;
rt::once!(ONCE);
rt::semaphore!(SEM);
static X: AtomicUsize = AtomicUsize::new(0);
fn f() {
X.fetch_add(1, Ordering::Relaxed);
}
fn oncer() {
rt::task::drop_privilege();
for _ in 0..ITERATIONS {
ONCE.call_once(f);
}
}
fn oncer_trap() {
oncer();
assert_eq!(
X.load(Ordering::Relaxed),
1,
"X did not have the expected value"
);
rt::trap();
}
rt::task!(oncer, rt::task::STACK_MIN, 0);
rt::task!(oncer_trap, rt::task::STACK_MIN, 0);