Implement clock_time_get on Windows (#119)
* Fix some Windows warnings. * Implement clock_time_get on Windows. Also update misc_testsuite to include latest clock_time_get test changes. * improve comments * Remove a leftover import. Co-Authored-By: Jakub Konka <kubkon@jakubkonka.com>
This commit is contained in:
committed by
Jakub Konka
parent
bb5c879718
commit
2659641132
@@ -27,6 +27,7 @@ rand = "0.7"
|
||||
cfg-if = "0.1.9"
|
||||
log = "0.4"
|
||||
filetime = "0.2.7"
|
||||
lazy_static = "1.4.0"
|
||||
|
||||
[target.'cfg(unix)'.dependencies]
|
||||
nix = "0.15"
|
||||
@@ -34,6 +35,8 @@ nix = "0.15"
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
winx = { path = "winx", version = "0.4.0" }
|
||||
winapi = "0.3"
|
||||
cpu-time = "1.0"
|
||||
|
||||
|
||||
[dev-dependencies]
|
||||
wasmtime-runtime = { git = "https://github.com/cranestation/wasmtime", rev = "875eea6" }
|
||||
|
||||
1
build.rs
1
build.rs
@@ -196,7 +196,6 @@ mod wasm_tests {
|
||||
"readlink_no_buffer" => true,
|
||||
"dangling_symlink" => true,
|
||||
"symlink_loop" => true,
|
||||
"clock_time_get" => true,
|
||||
"truncation_rights" => true,
|
||||
"fd_readdir" => true,
|
||||
"path_rename_trailing_slashes" => true,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
use crate::{Error, Result};
|
||||
use std::convert::TryInto;
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
pub(crate) fn systemtime_to_timestamp(st: SystemTime) -> Result<u64> {
|
||||
st.duration_since(UNIX_EPOCH)
|
||||
.map_err(|_| Error::EINVAL)? // date earlier than UNIX_EPOCH
|
||||
|
||||
@@ -226,9 +226,14 @@ pub(crate) const RIGHTS_ALL: __wasi_rights_t = __WASI_RIGHT_FD_DATASYNC
|
||||
|
||||
// Block and character device interaction is outside the scope of
|
||||
// WASI. Simply allow everything.
|
||||
// Those constants are unused on Windows
|
||||
#[allow(unused)]
|
||||
pub(crate) const RIGHTS_BLOCK_DEVICE_BASE: __wasi_rights_t = RIGHTS_ALL;
|
||||
#[allow(unused)]
|
||||
pub(crate) const RIGHTS_BLOCK_DEVICE_INHERITING: __wasi_rights_t = RIGHTS_ALL;
|
||||
#[allow(unused)]
|
||||
pub(crate) const RIGHTS_CHARACTER_DEVICE_BASE: __wasi_rights_t = RIGHTS_ALL;
|
||||
#[allow(unused)]
|
||||
pub(crate) const RIGHTS_CHARACTER_DEVICE_INHERITING: __wasi_rights_t = RIGHTS_ALL;
|
||||
|
||||
// Only allow directory operations on directories. Directories can only
|
||||
|
||||
@@ -1,18 +1,33 @@
|
||||
#![allow(non_camel_case_types)]
|
||||
#![allow(unused_unsafe)]
|
||||
#![allow(unused)]
|
||||
use crate::helpers::systemtime_to_timestamp;
|
||||
use crate::memory::*;
|
||||
use crate::sys::host_impl;
|
||||
use crate::{host, wasm32, Result};
|
||||
use crate::{host, wasm32, Error, Result};
|
||||
use cpu_time::{ProcessTime, ThreadTime};
|
||||
use lazy_static::lazy_static;
|
||||
use std::convert::TryInto;
|
||||
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
|
||||
|
||||
lazy_static! {
|
||||
static ref START_MONOTONIC: Instant = Instant::now();
|
||||
}
|
||||
|
||||
use wasi_common_cbindgen::wasi_common_cbindgen;
|
||||
|
||||
pub(crate) fn clock_res_get(clock_id: host::__wasi_clockid_t) -> Result<host::__wasi_timestamp_t> {
|
||||
unimplemented!("clock_res_get")
|
||||
}
|
||||
|
||||
pub(crate) fn clock_time_get(clock_id: host::__wasi_clockid_t) -> Result<host::__wasi_timestamp_t> {
|
||||
unimplemented!("clock_time_get")
|
||||
let duration = match clock_id {
|
||||
host::__WASI_CLOCK_REALTIME => get_monotonic_time(),
|
||||
host::__WASI_CLOCK_MONOTONIC => get_realtime_time()?,
|
||||
host::__WASI_CLOCK_PROCESS_CPUTIME_ID => get_proc_cputime()?,
|
||||
host::__WASI_CLOCK_THREAD_CPUTIME_ID => get_thread_cputime()?,
|
||||
_ => return Err(Error::EINVAL),
|
||||
};
|
||||
duration.as_nanos().try_into().map_err(Into::into)
|
||||
}
|
||||
|
||||
pub(crate) fn poll_oneoff(
|
||||
@@ -21,3 +36,27 @@ pub(crate) fn poll_oneoff(
|
||||
) -> Result<wasm32::size_t> {
|
||||
unimplemented!("poll_oneoff")
|
||||
}
|
||||
|
||||
fn get_monotonic_time() -> Duration {
|
||||
// We're circumventing the fact that we can't get a Duration from an Instant
|
||||
// The epoch of __WASI_CLOCK_MONOTONIC is undefined, so we fix a time point once
|
||||
// and count relative to this time point.
|
||||
//
|
||||
// The alternative would be to copy over the implementation of std::time::Instant
|
||||
// to our source tree and add a conversion to std::time::Duration
|
||||
START_MONOTONIC.elapsed()
|
||||
}
|
||||
|
||||
fn get_realtime_time() -> Result<Duration> {
|
||||
SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.map_err(|_| Error::EFAULT)
|
||||
}
|
||||
|
||||
fn get_proc_cputime() -> Result<Duration> {
|
||||
Ok(ProcessTime::try_now()?.as_duration())
|
||||
}
|
||||
|
||||
fn get_thread_cputime() -> Result<Duration> {
|
||||
Ok(ThreadTime::try_now()?.as_duration())
|
||||
}
|
||||
|
||||
@@ -320,7 +320,6 @@ pub unsafe fn get_file_access_mode(handle: RawHandle) -> Result<AccessMode> {
|
||||
use winapi::um::accctrl;
|
||||
use winapi::um::aclapi::GetSecurityInfo;
|
||||
use winapi::um::securitybaseapi::{GetAce, IsValidAcl};
|
||||
unsafe {
|
||||
let mut dacl = 0 as winnt::PACL;
|
||||
let mut sec_desc = 0 as winnt::PSECURITY_DESCRIPTOR;
|
||||
|
||||
@@ -355,7 +354,6 @@ pub unsafe fn get_file_access_mode(handle: RawHandle) -> Result<AccessMode> {
|
||||
Ok(AccessMode::from_bits_truncate(
|
||||
(*(ace as winnt::PACCESS_ALLOWED_ACE)).Mask,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_file_path(file: &File) -> Result<OsString> {
|
||||
|
||||
Reference in New Issue
Block a user