diff --git a/lib/wasi/Cargo.toml b/lib/wasi/Cargo.toml index efd64270e..34c65ff4c 100644 --- a/lib/wasi/Cargo.toml +++ b/lib/wasi/Cargo.toml @@ -19,6 +19,7 @@ log = "0.4.6" byteorder = "1.3.1" # hack to get tests to work wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.4.2", optional = true } +winapi = { version = "0.3.7", optional = true } [build-dependencies] glob = "0.2.11" diff --git a/lib/wasi/src/syscalls/windows.rs b/lib/wasi/src/syscalls/windows.rs index 6273695d3..e86caa2e8 100644 --- a/lib/wasi/src/syscalls/windows.rs +++ b/lib/wasi/src/syscalls/windows.rs @@ -5,7 +5,21 @@ pub fn platform_clock_res_get( clock_id: __wasi_clockid_t, resolution: &Cell<__wasi_timestamp_t>, ) -> __wasi_errno_t { - __WASI_EINVAL + let resolution = match clock_id { + // resolution of monotonic clock at 10ms, from: + // https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-gettickcount64 + __WASI_CLOCK_MONOTONIC => 10_000_000, + // TODO: verify or compute this + __WASI_CLOCK_REALTIME => 1, + __WASI_CLOCK_PROCESS_CPUTIME_ID => { + return __WASI_EINVAL; + } + __WASI_CLOCK_THREAD_CPUTIME_ID => { + return __WASI_EINVAL; + } + }; + resolution.set(resolution); + __WASI_ESUCCESS } pub fn platform_clock_time_get( @@ -13,5 +27,24 @@ pub fn platform_clock_time_get( precision: __wasi_timestamp_t, time: &Cell<__wasi_timestamp_t>, ) -> __wasi_errno_t { - unimplemented!() + let nanos = match clock_id { + __WASI_CLOCK_MONOTONIC => { + let tick_ms = winapi::um::sysinfoapi::GetTickCount64(); + tick_ms * 1_000_000 + } + __WASI_CLOCK_REALTIME => { + let duration = wasi_try!(std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .ok_or(__WASI_EIO)); + duration.as_nanos() as u64 + } + __WASI_CLOCK_PROCESS_CPUTIME_ID => { + unimplemented!("wasi::platform_clock_time_get(__WASI_CLOCK_PROCESS_CPUTIME_ID, ..)") + } + __WASI_CLOCK_THREAD_CPUTIME_ID => { + unimplemented!("wasi::platform_clock_time_get(__WASI_CLOCK_THREAD_CPUTIME_ID, ..)") + } + }; + time.set(nanos); + __WASI_ESUCCESS }