Path: blob/main/crates/wasi/src/p3/clocks/host.rs
1692 views
use crate::clocks::WasiClocksCtxView;1use crate::p3::bindings::clocks::{monotonic_clock, wall_clock};2use crate::p3::clocks::WasiClocks;3use core::time::Duration;4use tokio::time::sleep;5use wasmtime::component::Accessor;67impl wall_clock::Host for WasiClocksCtxView<'_> {8fn now(&mut self) -> wasmtime::Result<wall_clock::Datetime> {9let now = self.ctx.wall_clock.now();10Ok(wall_clock::Datetime {11seconds: now.as_secs(),12nanoseconds: now.subsec_nanos(),13})14}1516fn get_resolution(&mut self) -> wasmtime::Result<wall_clock::Datetime> {17let res = self.ctx.wall_clock.resolution();18Ok(wall_clock::Datetime {19seconds: res.as_secs(),20nanoseconds: res.subsec_nanos(),21})22}23}2425impl monotonic_clock::HostWithStore for WasiClocks {26async fn wait_until<U>(27store: &Accessor<U, Self>,28when: monotonic_clock::Instant,29) -> wasmtime::Result<()> {30let clock_now = store.with(|mut view| view.get().ctx.monotonic_clock.now());31if when > clock_now {32sleep(Duration::from_nanos(when - clock_now)).await;33};34Ok(())35}3637async fn wait_for<U>(38_store: &Accessor<U, Self>,39duration: monotonic_clock::Duration,40) -> wasmtime::Result<()> {41if duration > 0 {42sleep(Duration::from_nanos(duration)).await;43}44Ok(())45}46}4748impl monotonic_clock::Host for WasiClocksCtxView<'_> {49fn now(&mut self) -> wasmtime::Result<monotonic_clock::Instant> {50Ok(self.ctx.monotonic_clock.now())51}5253fn get_resolution(&mut self) -> wasmtime::Result<monotonic_clock::Instant> {54Ok(self.ctx.monotonic_clock.resolution())55}56}575859