* 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>
63 lines
2.0 KiB
Rust
63 lines
2.0 KiB
Rust
#![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, 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();
|
|
}
|
|
|
|
|
|
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> {
|
|
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(
|
|
input: Vec<Result<host::__wasi_subscription_t>>,
|
|
output_slice: &mut [wasm32::__wasi_event_t],
|
|
) -> 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())
|
|
}
|