pub mod linux;
use crate::types::Ticks;
pub trait PlatformClock {
fn now_ticks(&self) -> Ticks;
fn ticks_to_nanos(&self, ticks: Ticks) -> u64;
fn nanos_to_ticks(&self, ns: u64) -> Ticks;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct NoopClock;
impl PlatformClock for NoopClock {
#[inline]
fn now_ticks(&self) -> Ticks {
Ticks::new(0)
}
#[inline]
fn ticks_to_nanos(&self, ticks: Ticks) -> u64 {
*ticks.as_u64()
}
#[inline]
fn nanos_to_ticks(&self, ns: u64) -> Ticks {
Ticks::new(ns)
}
}
impl PlatformClock for () {
#[inline]
fn now_ticks(&self) -> Ticks {
Ticks::new(0)
}
#[inline]
fn ticks_to_nanos(&self, ticks: Ticks) -> u64 {
*ticks.as_u64()
}
#[inline]
fn nanos_to_ticks(&self, ns: u64) -> Ticks {
Ticks::new(ns)
}
}
pub struct Span<'a, C: PlatformClock> {
clk: &'a C,
start: Ticks,
}
impl<'a, C: PlatformClock> Span<'a, C> {
#[inline]
pub fn start(clk: &'a C) -> Self {
Self {
clk,
start: clk.now_ticks(),
}
}
#[inline]
pub fn end_ns(self) -> u64 {
let end = self.clk.now_ticks();
let t0 = self.clk.ticks_to_nanos(self.start);
let t1 = self.clk.ticks_to_nanos(end);
t1.saturating_sub(t0)
}
}
pub trait Timers {
fn sleep_until(&self, ticks: Ticks);
fn sleep_for(&self, ticks: Ticks);
}
pub trait Affinity {
fn pin_to_core(&self, core_id: u32);
fn set_numa_node(&self, node_id: u32);
}