zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit bb0c5f7a2f816709a0ec5af7099057fdfbfad04a (tree)
parent 1fabd6bbf355eb6111c4ed88be97f1ec2bf7b1ae
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Tue, 30 Apr 2019 21:52:26 -0400

Merge pull request #2392 from shritesh/wasi_clock

wasi: implement timestamp
Diffstat:
Mstd/os/time.zig | 13+++++++++++++
Mstd/os/wasi/core.zig | 10++++++++++
2 files changed, 23 insertions(+), 0 deletions(-)

diff --git 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 @@ -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;