65 lines
1.4 KiB
Rust
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);
|