aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-08-10 23:01:31 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-08-10 23:01:31 +0200
commita2cd763dbbab113882dd2cfb771907203a1ea148 (patch)
tree2299f1664c741e61fdd62f8d0aef6e37f9285206
parent6918d8aaa6e13fb7529884a436aa20a87e6b6f10 (diff)
time: wasi implementation
-rw-r--r--core/sys/wasm/wasi/wasi_api.odin8
-rw-r--r--core/time/time_wasi.odin46
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()
}