Browse Source

Merge pull request #4055 from laytan/time-wasi

time: wasi implementation
gingerBill 1 year ago
parent
commit
09a07bd7e0
2 changed files with 42 additions and 12 deletions
  1. 4 4
      core/sys/wasm/wasi/wasi_api.odin
  2. 38 8
      core/time/time_wasi.odin

+ 4 - 4
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,

+ 38 - 8
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()
 }