Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wasi/src/p3/clocks/host.rs
1692 views
1
use crate::clocks::WasiClocksCtxView;
2
use crate::p3::bindings::clocks::{monotonic_clock, wall_clock};
3
use crate::p3::clocks::WasiClocks;
4
use core::time::Duration;
5
use tokio::time::sleep;
6
use wasmtime::component::Accessor;
7
8
impl 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
26
impl 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
49
impl 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
}
58
59