rt/rust/examples/mutex.rs

65 lines
1.4 KiB
Rust

#![no_main]
rt::mutex!(MUTEX, u32, 0);
const NUM_TASKS: u32 = 3;
const ITERATIONS: u32 = 10000;
fn trap_last() {
rt::semaphore!(TRAP_SEM, NUM_TASKS as i32 - 1);
if !TRAP_SEM.try_wait() {
assert_eq!(
*MUTEX.try_lock().expect("mutex should be unlocked"),
ITERATIONS * NUM_TASKS,
"the mutex did not contain the expected value"
);
rt::trap();
}
}
fn increment_lock() {
rt::task::drop_privilege();
for _ in 0..ITERATIONS {
*MUTEX.lock() += 1;
}
trap_last();
}
fn increment_trylock() {
rt::task::drop_privilege();
for _ in 0..ITERATIONS {
let mut guard = loop {
if let Some(guard) = MUTEX.try_lock() {
break guard;
} else {
rt::task::sleep(1);
}
};
*guard += 1;
}
trap_last();
}
fn increment_timedlock() {
rt::task::drop_privilege();
for _ in 0..ITERATIONS {
let mut guard = loop {
if let Some(guard) = MUTEX.timed_lock(1) {
break guard;
}
};
*guard += 1;
}
trap_last();
}
fn timeout() {
rt::task::sleep(1000);
panic!("timed out");
}
rt::task!(increment_lock, rt::task::STACK_MIN, 1);
rt::task!(increment_trylock, rt::task::STACK_MIN, 1);
rt::task!(increment_timedlock, rt::task::STACK_MIN, 1);
rt::task!(timeout, rt::task::STACK_MIN, 0);