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