use std::{
io,
sync::OnceLock,
task::{Poll, Waker},
time::Instant,
};
use crate::handle::Handle;
pub trait Timer: Send + Sync {
fn deadline(&self, waker: Waker, deadline: Instant) -> io::Result<Option<Handle>>;
fn timeout_wait(&self, waker: Waker, handle: &Handle) -> Poll<()>;
}
static GLOBAL_TIMER: OnceLock<Box<dyn Timer>> = OnceLock::new();
pub fn register_global_timer<T: Timer + 'static>(timer: T) {
if GLOBAL_TIMER.set(Box::new(timer)).is_err() {
panic!("Multiple calls to register_global_timer are not permitted!!!");
}
}
pub fn global_timer() -> &'static dyn Timer {
GLOBAL_TIMER
.get()
.expect("Call register_global_timer first")
.as_ref()
}