50 lines
972 B
Rust
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");
|
|
}
|
|
}
|