aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-04-30 21:52:26 -0400
committerGitHub <noreply@github.com>2019-04-30 21:52:26 -0400
commitbb0c5f7a2f816709a0ec5af7099057fdfbfad04a (patch)
tree3d5fb6d6a3de329464e56a5face49e785e76e807 /std
parent1fabd6bbf355eb6111c4ed88be97f1ec2bf7b1ae (diff)
parentd395ed2d403aa0ff57c493052e3675de23292424 (diff)
downloadzig-bb0c5f7a2f816709a0ec5af7099057fdfbfad04a.tar.gz
zig-bb0c5f7a2f816709a0ec5af7099057fdfbfad04a.zip
Merge pull request #2392 from shritesh/wasi_clock
wasi: implement timestamp
Diffstat (limited to 'std')
-rw-r--r--std/os/time.zig13
-rw-r--r--std/os/wasi/core.zig10
2 files changed, 23 insertions, 0 deletions
diff --git a/std/os/time.zig b/std/os/time.zig
index 66ceedb1b6..d742c5d03b 100644
--- a/std/os/time.zig
+++ b/std/os/time.zig
@@ -7,6 +7,7 @@ const testing = std.testing;
const windows = std.os.windows;
const linux = std.os.linux;
const darwin = std.os.darwin;
+const wasi = std.os.wasi;
const posix = std.os.posix;
pub const epoch = @import("epoch.zig");
@@ -64,9 +65,21 @@ pub const milliTimestamp = switch (builtin.os) {
Os.windows => milliTimestampWindows,
Os.linux, Os.freebsd, Os.netbsd => milliTimestampPosix,
Os.macosx, Os.ios => milliTimestampDarwin,
+ Os.wasi => milliTimestampWasi,
else => @compileError("Unsupported OS"),
};
+fn milliTimestampWasi() u64 {
+ var ns: wasi.timestamp_t = undefined;
+
+ // TODO: Verify that precision is ignored
+ const err = wasi.clock_time_get(wasi.CLOCK_REALTIME, 1, &ns);
+ debug.assert(err == wasi.ESUCCESS);
+
+ const ns_per_ms = 1000;
+ return @divFloor(ns, ns_per_ms);
+}
+
fn milliTimestampWindows() u64 {
//FileTime has a granularity of 100 nanoseconds
// and uses the NTFS/Windows epoch
diff --git a/std/os/wasi/core.zig b/std/os/wasi/core.zig
index b296b83c70..23a0c7ba65 100644
--- a/std/os/wasi/core.zig
+++ b/std/os/wasi/core.zig
@@ -1,18 +1,28 @@
+pub const clockid_t = u32;
pub const errno_t = u16;
pub const exitcode_t = u32;
pub const fd_t = u32;
pub const signal_t = u8;
+pub const timestamp_t = u64;
pub const ciovec_t = extern struct {
buf: [*]const u8,
buf_len: usize,
};
+pub const CLOCK_REALTIME: clockid_t = 0;
+pub const CLOCK_MONOTONIC: clockid_t = 1;
+pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2;
+pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3;
+
pub const SIGABRT: signal_t = 6;
pub extern "wasi_unstable" fn args_get(argv: [*][*]u8, argv_buf: [*]u8) errno_t;
pub extern "wasi_unstable" fn args_sizes_get(argc: *usize, argv_buf_size: *usize) errno_t;
+pub extern "wasi_unstable" fn clock_res_get(clock_id: clockid_t, resolution: *timestamp_t) errno_t;
+pub extern "wasi_unstable" fn clock_time_get(clock_id: clockid_t, precision: timestamp_t, timestamp: *timestamp_t) errno_t;
+
pub extern "wasi_unstable" fn environ_get(environ: [*]?[*]u8, environ_buf: [*]u8) errno_t;
pub extern "wasi_unstable" fn environ_sizes_get(environ_count: *usize, environ_buf_size: *usize) errno_t;