From a2cd763dbbab113882dd2cfb771907203a1ea148 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sat, 10 Aug 2024 23:01:31 +0200 Subject: [PATCH] time: wasi implementation --- core/sys/wasm/wasi/wasi_api.odin | 8 +++--- core/time/time_wasi.odin | 46 ++++++++++++++++++++++++++------ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/core/sys/wasm/wasi/wasi_api.odin b/core/sys/wasm/wasi/wasi_api.odin index 6ae6c9151..38d95e754 100644 --- a/core/sys/wasm/wasi/wasi_api.odin +++ b/core/sys/wasm/wasi/wasi_api.odin @@ -10,9 +10,9 @@ filesize_t :: distinct u64 timestamp_t :: distinct u64 clockid_t :: distinct u32 -CLOCK_MONOTONIC :: clockid_t(0) -CLOCK_PROCESS_CPUTIME_ID :: clockid_t(1) -CLOCK_REALTIME :: clockid_t(2) +CLOCK_REALTIME :: clockid_t(0) +CLOCK_MONOTONIC :: clockid_t(1) +CLOCK_PROCESS_CPUTIME_ID :: clockid_t(2) CLOCK_THREAD_CPUTIME_ID :: clockid_t(3) errno_t :: enum u16 { @@ -715,7 +715,7 @@ subscription_t :: struct { * The type of the event to which to subscribe, and its contents */ using contents: struct { - tag: u8, + tag: eventtype_t, using u: struct #raw_union { clock: subscription_clock_t, fd_read: subscription_fd_readwrite_t, diff --git a/core/time/time_wasi.odin b/core/time/time_wasi.odin index 3a5554d67..452c741d2 100644 --- a/core/time/time_wasi.odin +++ b/core/time/time_wasi.odin @@ -2,23 +2,53 @@ //+build wasi package time -_IS_SUPPORTED :: false +import "base:intrinsics" + +import "core:sys/wasm/wasi" + +_IS_SUPPORTED :: true _now :: proc "contextless" () -> Time { - return {} + ts, err := wasi.clock_time_get(wasi.CLOCK_REALTIME, 0) + when !ODIN_DISABLE_ASSERT { + if err != nil { + intrinsics.trap() + } + } + return Time{_nsec=i64(ts)} } _sleep :: proc "contextless" (d: Duration) { + ev: wasi.event_t + n, err := wasi.poll_oneoff( + &{ + tag = .CLOCK, + clock = { + id = wasi.CLOCK_MONOTONIC, + timeout = wasi.timestamp_t(d), + }, + }, + &ev, + 1, + ) + + when !ODIN_DISABLE_ASSERT { + if err != nil || n != 1 || ev.error != nil || ev.type != .CLOCK { + intrinsics.trap() + } + } } _tick_now :: proc "contextless" () -> Tick { - // mul_div_u64 :: proc "contextless" (val, num, den: i64) -> i64 { - // q := val / den - // r := val % den - // return q * num + r * num / den - // } - return {} + ts, err := wasi.clock_time_get(wasi.CLOCK_MONOTONIC, 0) + when !ODIN_DISABLE_ASSERT { + if err != nil { + intrinsics.trap() + } + } + return Tick{_nsec=i64(ts)} } _yield :: proc "contextless" () { + wasi.sched_yield() }