time: wasi implementation

This commit is contained in:
Laytan Laats
2024-08-10 23:01:31 +02:00
parent 6918d8aaa6
commit a2cd763dbb
2 changed files with 42 additions and 12 deletions

View File

@@ -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,

View File

@@ -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()
}