use std::time::Instant;
use crate::core::sched::HostClock;
#[derive(Debug, Clone, Copy)]
pub struct MonotonicClock {
origin: Instant,
}
impl MonotonicClock {
#[must_use]
pub fn new() -> MonotonicClock {
MonotonicClock {
origin: Instant::now(),
}
}
}
impl Default for MonotonicClock {
fn default() -> MonotonicClock {
MonotonicClock::new()
}
}
impl HostClock for MonotonicClock {
fn monotonic_nanos(&self) -> u64 {
u64::try_from(self.origin.elapsed().as_nanos()).unwrap_or(u64::MAX)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_starts_near_zero_and_never_goes_backwards() {
let clock = MonotonicClock::new();
let first = clock.monotonic_nanos();
assert!(first < 1_000_000_000, "{first}");
let second = clock.monotonic_nanos();
assert!(second >= first);
}
#[test]
fn it_is_the_trait_the_scheduler_asks_for() {
fn takes(_: Box<dyn HostClock>) {}
takes(Box::new(MonotonicClock::new()));
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<MonotonicClock>();
}
}