Merge pull request #2392 from shritesh/wasi_clock

wasi: implement timestamp
This commit is contained in:
Andrew Kelley 2019-04-30 21:52:26 -04:00 committed by GitHub
commit bb0c5f7a2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 0 deletions

View File

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

View File

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