use std::sync::{
OnceLock,
atomic::{AtomicBool, Ordering},
};
use kithara_platform::{
thread::{self, Thread, park_timeout},
time::{Duration, Instant},
};
#[derive(Default)]
pub(crate) struct SchedulerWake {
woken: AtomicBool,
waiter: OnceLock<Thread>,
}
impl SchedulerWake {
pub(crate) fn wait_timeout(&self, timeout: Duration) -> bool {
if self.waiter.get().is_none() {
let _ = self.waiter.set(thread::current());
}
let deadline = Instant::now() + timeout;
loop {
if self.woken.swap(false, Ordering::Acquire) {
return true;
}
let now = Instant::now();
if now >= deadline {
return false;
}
park_timeout(deadline - now);
if self.woken.swap(false, Ordering::Acquire) {
return true;
}
}
}
pub(crate) fn wake(&self) {
self.woken.store(true, Ordering::Release);
if let Some(waiter) = self.waiter.get() {
waiter.unpark();
}
}
}