wasmtime_wasi/p3/clocks/
host.rs

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