wasi_common/sync/
clocks.rs

1use crate::clocks::{WasiClocks, WasiMonotonicClock, WasiSystemClock};
2use cap_std::time::{Duration, Instant, SystemTime};
3use cap_std::{ambient_authority, AmbientAuthority};
4use cap_time_ext::{MonotonicClockExt, SystemClockExt};
5
6pub struct SystemClock(cap_std::time::SystemClock);
7
8impl SystemClock {
9    pub fn new(ambient_authority: AmbientAuthority) -> Self {
10        SystemClock(cap_std::time::SystemClock::new(ambient_authority))
11    }
12}
13impl WasiSystemClock for SystemClock {
14    fn resolution(&self) -> Duration {
15        self.0.resolution()
16    }
17    fn now(&self, precision: Duration) -> SystemTime {
18        self.0.now_with(precision)
19    }
20}
21
22pub struct MonotonicClock(cap_std::time::MonotonicClock);
23impl MonotonicClock {
24    pub fn new(ambient_authority: AmbientAuthority) -> Self {
25        MonotonicClock(cap_std::time::MonotonicClock::new(ambient_authority))
26    }
27}
28impl WasiMonotonicClock for MonotonicClock {
29    fn resolution(&self) -> Duration {
30        self.0.resolution()
31    }
32    fn now(&self, precision: Duration) -> Instant {
33        self.0.now_with(precision)
34    }
35}
36
37pub fn clocks_ctx() -> WasiClocks {
38    WasiClocks::new()
39        .with_system(SystemClock::new(ambient_authority()))
40        .with_monotonic(MonotonicClock::new(ambient_authority()))
41}