use dtact::FiberStatus;
use loom::sync::Arc;
use loom::sync::atomic::{AtomicU8, Ordering};
use loom::thread;
struct MockFiberContext {
state: AtomicU8,
}
#[cfg_attr(miri, ignore)]
#[test]
fn test_fiber_state_transitions() {
loom::model(|| {
let ctx = Arc::new(MockFiberContext {
state: AtomicU8::new(FiberStatus::Initial as u8),
});
ctx.state
.store(FiberStatus::Running as u8, Ordering::Release);
let ctx_clone = ctx.clone();
let waker = thread::spawn(move || {
let prev = ctx_clone
.state
.swap(FiberStatus::Notified as u8, Ordering::AcqRel);
if prev == FiberStatus::Yielded as u8 {
}
});
let waiter = thread::spawn(move || {
ctx.state
.store(FiberStatus::Running as u8, Ordering::Release);
if ctx
.state
.compare_exchange(
FiberStatus::Running as u8,
FiberStatus::Yielded as u8,
Ordering::Release,
Ordering::Acquire,
)
.is_ok()
{
}
});
waker.join().unwrap();
waiter.join().unwrap();
});
}