From aa38882050f49f3d2427951a9a615d28852eb597 Mon Sep 17 00:00:00 2001 From: "M.Amin Rayej" Date: Tue, 14 May 2024 14:06:18 +0330 Subject: [PATCH] calculate the duration when timeout is absolute --- lib/wasix/src/syscalls/wasi/clock_time_get.rs | 1 + lib/wasix/src/syscalls/wasi/poll_oneoff.rs | 21 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/wasix/src/syscalls/wasi/clock_time_get.rs b/lib/wasix/src/syscalls/wasi/clock_time_get.rs index 3ba7dac9cae..33cad5ba50a 100644 --- a/lib/wasix/src/syscalls/wasi/clock_time_get.rs +++ b/lib/wasix/src/syscalls/wasi/clock_time_get.rs @@ -12,6 +12,7 @@ use crate::syscalls::*; /// - `Timestamp *time` /// The value of the clock in nanoseconds //#[instrument(level = "trace", skip_all, fields(?clock_id, %precision), ret)] +#[instrument(level = "trace", skip_all, ret)] pub fn clock_time_get( mut ctx: FunctionEnvMut<'_, WasiEnv>, clock_id: Snapshot0Clockid, diff --git a/lib/wasix/src/syscalls/wasi/poll_oneoff.rs b/lib/wasix/src/syscalls/wasi/poll_oneoff.rs index d9d6e0f942f..2f9885c2963 100644 --- a/lib/wasix/src/syscalls/wasi/poll_oneoff.rs +++ b/lib/wasix/src/syscalls/wasi/poll_oneoff.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use wasmer_wasix_types::wasi::{SubscriptionClock, Userdata}; +use wasmer_wasix_types::wasi::{Subclockflags, SubscriptionClock, Userdata}; use super::*; use crate::{ @@ -299,7 +299,24 @@ where time_to_sleep = Duration::ZERO; clock_subs.push((clock_info, s.userdata)); } else { - time_to_sleep = Duration::from_nanos(clock_info.timeout); + // if the timeout is specified as an absolute time in the future, + // we should calculate the duration we need to sleep + time_to_sleep = if clock_info + .flags + .contains(Subclockflags::SUBSCRIPTION_CLOCK_ABSTIME) + { + let now = wasi_try_ok!(platform_clock_time_get( + Snapshot0Clockid::Monotonic, + 1 + )) as u64; + + Duration::from_nanos(clock_info.timeout) + - Duration::from_nanos(now as u64) + } else { + // if the timeout is not absolute, just use it as duration + Duration::from_nanos(clock_info.timeout) + }; + clock_subs.push((clock_info, s.userdata)); } continue;