use std::sync::OnceLock;
use std::task::Waker;
use crate::time::{Driver, Instant};
pub static DRIVER: StdThreadDriver = StdThreadDriver {
epoch: OnceLock::new(),
};
pub struct StdThreadDriver {
epoch: OnceLock<std::time::Instant>,
}
impl StdThreadDriver {
fn epoch(&self) -> std::time::Instant {
*self.epoch.get_or_init(std::time::Instant::now)
}
}
impl Driver for StdThreadDriver {
fn now(&self) -> Instant {
let elapsed = std::time::Instant::now().saturating_duration_since(self.epoch());
Instant::from_monotonic(elapsed)
}
fn schedule_wake(&self, deadline: Instant, waker: Waker) {
let target = self.epoch() + deadline.into_monotonic();
std::thread::spawn(move || {
let now = std::time::Instant::now();
if now < target {
std::thread::sleep(target - now);
}
waker.wake();
});
}
}