Skip to main content

wasmtime_wasi/p3/clocks/
host.rs

1use crate::clocks::WasiClocksCtxView;
2use crate::p3::bindings::clocks::{monotonic_clock, system_clock, types};
3use crate::p3::clocks::WasiClocks;
4use core::time::Duration;
5use tokio::time::sleep;
6use wasmtime::component::Accessor;
7
8impl types::Host for WasiClocksCtxView<'_> {}
9
10impl system_clock::Host for WasiClocksCtxView<'_> {
11    fn now(&mut self) -> wasmtime::Result<system_clock::Instant> {
12        let now = self.ctx.wall_clock.now();
13        Ok(system_clock::Instant {
14            seconds: now.as_secs().try_into()?,
15            nanoseconds: now.subsec_nanos(),
16        })
17    }
18
19    fn get_resolution(&mut self) -> wasmtime::Result<types::Duration> {
20        let res = self.ctx.wall_clock.resolution();
21        Ok(res.as_nanos().try_into()?)
22    }
23}
24
25impl monotonic_clock::HostWithStore for WasiClocks {
26    async fn wait_until<U>(
27        store: &Accessor<U, Self>,
28        when: monotonic_clock::Mark,
29    ) -> wasmtime::Result<()> {
30        let clock_now = store.with(|mut view| view.get().ctx.monotonic_clock.now());
31        if when > clock_now {
32            sleep(Duration::from_nanos(when - clock_now)).await;
33        };
34        Ok(())
35    }
36
37    async fn wait_for<U>(
38        _store: &Accessor<U, Self>,
39        duration: types::Duration,
40    ) -> wasmtime::Result<()> {
41        if duration > 0 {
42            sleep(Duration::from_nanos(duration)).await;
43        }
44        Ok(())
45    }
46}
47
48impl monotonic_clock::Host for WasiClocksCtxView<'_> {
49    fn now(&mut self) -> wasmtime::Result<monotonic_clock::Mark> {
50        Ok(self.ctx.monotonic_clock.now())
51    }
52
53    fn get_resolution(&mut self) -> wasmtime::Result<types::Duration> {
54        Ok(self.ctx.monotonic_clock.resolution())
55    }
56}