wasmtime_wasi/p3/clocks/
host.rs1use 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}