Path: blob/main/crates/wasi/src/p3/clocks/host.rs
3101 views
use crate::clocks::WasiClocksCtxView;1use crate::p3::bindings::clocks::{monotonic_clock, system_clock, types};2use crate::p3::clocks::WasiClocks;3use core::time::Duration;4use tokio::time::sleep;5use wasmtime::component::Accessor;67impl types::Host for WasiClocksCtxView<'_> {}89impl system_clock::Host for WasiClocksCtxView<'_> {10fn now(&mut self) -> wasmtime::Result<system_clock::Instant> {11let now = self.ctx.wall_clock.now();12Ok(system_clock::Instant {13seconds: now.as_secs().try_into()?,14nanoseconds: now.subsec_nanos(),15})16}1718fn get_resolution(&mut self) -> wasmtime::Result<types::Duration> {19let res = self.ctx.wall_clock.resolution();20Ok(res.as_nanos().try_into()?)21}22}2324impl monotonic_clock::HostWithStore for WasiClocks {25async fn wait_until<U>(26store: &Accessor<U, Self>,27when: monotonic_clock::Mark,28) -> wasmtime::Result<()> {29let clock_now = store.with(|mut view| view.get().ctx.monotonic_clock.now());30if when > clock_now {31sleep(Duration::from_nanos(when - clock_now)).await;32};33Ok(())34}3536async fn wait_for<U>(37_store: &Accessor<U, Self>,38duration: types::Duration,39) -> wasmtime::Result<()> {40if duration > 0 {41sleep(Duration::from_nanos(duration)).await;42}43Ok(())44}45}4647impl monotonic_clock::Host for WasiClocksCtxView<'_> {48fn now(&mut self) -> wasmtime::Result<monotonic_clock::Mark> {49Ok(self.ctx.monotonic_clock.now())50}5152fn get_resolution(&mut self) -> wasmtime::Result<types::Duration> {53Ok(self.ctx.monotonic_clock.resolution())54}55}565758