Path: blob/main/crates/wasi-common/src/clocks.rs
1691 views
use crate::{Error, ErrorExt};1use cap_std::time::{Duration, Instant, SystemTime};23pub enum SystemTimeSpec {4SymbolicNow,5Absolute(SystemTime),6}78pub trait WasiSystemClock: Send + Sync {9fn resolution(&self) -> Duration;10fn now(&self, precision: Duration) -> SystemTime;11}1213pub trait WasiMonotonicClock: Send + Sync {14fn resolution(&self) -> Duration;15fn now(&self, precision: Duration) -> Instant;16}1718pub struct WasiMonotonicOffsetClock {19pub creation_time: cap_std::time::Instant,20pub abs_clock: Box<dyn WasiMonotonicClock>,21}2223impl WasiMonotonicOffsetClock {24pub fn new(clock: impl 'static + WasiMonotonicClock) -> Self {25Self {26creation_time: clock.now(clock.resolution()),27abs_clock: Box::new(clock),28}29}30}3132pub struct WasiClocks {33pub system: Option<Box<dyn WasiSystemClock>>,34pub monotonic: Option<WasiMonotonicOffsetClock>,35}3637impl WasiClocks {38pub fn new() -> Self {39Self {40system: None,41monotonic: None,42}43}4445pub fn with_system(mut self, clock: impl 'static + WasiSystemClock) -> Self {46self.system = Some(Box::new(clock));47self48}4950pub fn with_monotonic(mut self, clock: impl 'static + WasiMonotonicClock) -> Self {51self.monotonic = Some(WasiMonotonicOffsetClock::new(clock));52self53}5455pub fn system(&self) -> Result<&dyn WasiSystemClock, Error> {56self.system57.as_deref()58.ok_or_else(|| Error::badf().context("system clock is not supported"))59}6061pub fn monotonic(&self) -> Result<&WasiMonotonicOffsetClock, Error> {62self.monotonic63.as_ref()64.ok_or_else(|| Error::badf().context("monotonic clock is not supported"))65}66}676869