rt/rust/examples/rwlock.rs

50 lines
972 B
Rust

use core::sync::atomic::{AtomicBool, Ordering};
struct Point {
x: u32,
y: u32,
}
rt::rwlock!(POINT, Point, Point { x: 0, y: 0 });
static MISMATCH: AtomicBool = AtomicBool::new(false);
fn reader() {
rt::task::drop_privilege();
loop {
let p = POINT.read();
if p.x != p.y {
MISMATCH.store(true, Ordering::Relaxed);
}
}
}
fn writer() {
rt::task::drop_privilege();
loop {
let mut p = POINT.write();
p.x += 1;
p.y += 1;
drop(p);
rt::task::sleep(1);
}
}
fn timeout() {
rt::task::drop_privilege();
rt::task::sleep(50);
rt::stop();
}
fn main() {
rt::task!(reader, rt::task::STACK_MIN, 1);
rt::task!(reader, rt::task::STACK_MIN, 1);
rt::task!(writer, rt::task::STACK_MIN, 1);
rt::task!(timeout, rt::task::STACK_MIN, 2);
rt::start();
if MISMATCH.load(Ordering::Relaxed) {
panic!("point coordinates did not match");
}
}