From 4813047d375d1b3a8a6701f911b2d99224aa39ca Mon Sep 17 00:00:00 2001 From: Mackenzie Clark Date: Wed, 26 Dec 2018 16:55:53 -0800 Subject: [PATCH 1/2] clock_gettime with time crate and test more lint --- Cargo.lock | 12 ++++++++++++ Cargo.toml | 1 + build/emtests.rs | 7 ++++++- emtests/clock_gettime.c | 10 ++++++++++ emtests/clock_gettime.output | 1 + emtests/clock_gettime.wasm | Bin 0 -> 45352 bytes src/apis/emscripten/time.rs | 24 ++++++++---------------- src/emtests/clock_gettime.rs | 9 +++++++++ src/emtests/mod.rs | 1 + 9 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 emtests/clock_gettime.c create mode 100644 emtests/clock_gettime.output create mode 100644 emtests/clock_gettime.wasm create mode 100644 src/emtests/clock_gettime.rs diff --git a/Cargo.lock b/Cargo.lock index b874d507b..1a41feac5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -811,6 +811,16 @@ dependencies = [ "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "time" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ucd-util" version = "0.1.1" @@ -899,6 +909,7 @@ dependencies = [ "structopt 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasmparser 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1030,6 +1041,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" +"checksum time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "847da467bf0db05882a9e2375934a8a55cffdc9db0d128af1518200260ba1f6c" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" diff --git a/Cargo.toml b/Cargo.toml index 5c09b9f2a..4968e0803 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,7 @@ rayon = "1.0.3" byteorder = "1" indicatif = "0.10" console = "0.7.1" +time = "0.1.41" [build-dependencies] wabt = "0.7.2" diff --git a/build/emtests.rs b/build/emtests.rs index 2d5306994..591be871b 100644 --- a/build/emtests.rs +++ b/build/emtests.rs @@ -11,7 +11,12 @@ use std::process::Command; static BANNER: &str = "// Rust test file autogenerated with cargo build (build/emtests.rs). // Please do NOT modify it by hand, as it will be reseted on next build.\n"; -const TESTS: [&str; 3] = ["emtests/env.c", "emtests/puts.c", "emtests/printf.c"]; +const TESTS: [&str; 4] = [ + "emtests/env.c", + "emtests/puts.c", + "emtests/printf.c", + "emtests/clock_gettime.c", +]; pub fn compile(file: &str) -> String { let mut output_path = PathBuf::from(file); diff --git a/emtests/clock_gettime.c b/emtests/clock_gettime.c new file mode 100644 index 000000000..d085fb200 --- /dev/null +++ b/emtests/clock_gettime.c @@ -0,0 +1,10 @@ +#include +#include + +// a simple program that simply calls clock_gettime +// not easy to unit test because of non-determinism and so compilation is enough for now +int main () { + struct timespec tp; + clock_gettime(CLOCK_REALTIME, &tp); + printf("clock_gettime\n"); +} diff --git a/emtests/clock_gettime.output b/emtests/clock_gettime.output new file mode 100644 index 000000000..9dab40160 --- /dev/null +++ b/emtests/clock_gettime.output @@ -0,0 +1 @@ +clock_gettime diff --git a/emtests/clock_gettime.wasm b/emtests/clock_gettime.wasm new file mode 100644 index 0000000000000000000000000000000000000000..61b26a79db4f6c11f00bb1c72ff41d3fb4899d48 GIT binary patch literal 45352 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�_(J&hZbKew1{{zTA0%WVJpV7n%oBK_9GFf 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 JS{uQO{{qy7--7@E literal 0 HcmV?d00001 diff --git a/src/apis/emscripten/time.rs b/src/apis/emscripten/time.rs index 40c6ba11a..7b3ef97fa 100644 --- a/src/apis/emscripten/time.rs +++ b/src/apis/emscripten/time.rs @@ -1,11 +1,10 @@ use super::utils::{copy_cstr_into_wasm, write_to_buf}; -use libc::{ - c_char, c_int, clock_gettime as libc_clock_gettime, localtime, localtime_r, time, time_t, - timespec, tm, -}; +use libc::{c_char, c_int, localtime, localtime_r, time as libc_time, time_t, timespec, tm}; use std::mem; use std::time::SystemTime; +use time; + use crate::webassembly::Instance; /// emscripten: _gettimeofday @@ -41,19 +40,12 @@ pub extern "C" fn _clock_gettime(clk_id: c_int, tp: c_int, instance: &mut Instan tv_nsec: i32, } - unsafe { - let mut timespec = timespec { - tv_sec: 0, - tv_nsec: 0, - }; - let ret = libc_clock_gettime(clk_id as _, &mut timespec); - if ret != 0 { - return ret; - } + let timespec = time::get_time(); + unsafe { let timespec_struct_ptr = instance.memory_offset_addr(0, tp as _) as *mut GuestTimeSpec; - (*timespec_struct_ptr).tv_sec = timespec.tv_sec as _; - (*timespec_struct_ptr).tv_nsec = timespec.tv_nsec as _; + (*timespec_struct_ptr).tv_sec = timespec.sec as _; + (*timespec_struct_ptr).tv_nsec = timespec.nsec as _; } 0 } @@ -244,7 +236,7 @@ pub extern "C" fn _time(time_p: u32, instance: &mut Instance) -> time_t { unsafe { let time_p_addr = instance.memory_offset_addr(0, time_p as _) as *mut i64; - time(time_p_addr) + libc_time(time_p_addr) } } diff --git a/src/emtests/clock_gettime.rs b/src/emtests/clock_gettime.rs new file mode 100644 index 000000000..354865412 --- /dev/null +++ b/src/emtests/clock_gettime.rs @@ -0,0 +1,9 @@ +#[test] +fn test_clock_gettime() { + assert_emscripten_output!( + "../../emtests/clock_gettime.wasm", + "clock_gettime", + vec![], + "../../emtests/clock_gettime.output" + ); +} diff --git a/src/emtests/mod.rs b/src/emtests/mod.rs index b5572f6dd..8e7884ef6 100644 --- a/src/emtests/mod.rs +++ b/src/emtests/mod.rs @@ -4,6 +4,7 @@ // The _common module is not autogenerated, as it provides common macros for the emtests #[macro_use] mod _common; +mod clock_gettime; mod env; mod printf; mod puts; From 2107df3c994f6d03a06898de303bb72ecac48b93 Mon Sep 17 00:00:00 2001 From: Mackenzie Clark Date: Thu, 27 Dec 2018 06:57:00 -0800 Subject: [PATCH 2/2] only support clock id 0 --- src/apis/emscripten/time.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apis/emscripten/time.rs b/src/apis/emscripten/time.rs index 7b3ef97fa..614a38540 100644 --- a/src/apis/emscripten/time.rs +++ b/src/apis/emscripten/time.rs @@ -40,7 +40,11 @@ pub extern "C" fn _clock_gettime(clk_id: c_int, tp: c_int, instance: &mut Instan tv_nsec: i32, } - let timespec = time::get_time(); + let timespec = match clk_id { + 0 => time::get_time(), + 1 => panic!("Monotonic clock is not supported."), + _ => panic!("Clock is not supported."), + }; unsafe { let timespec_struct_ptr = instance.memory_offset_addr(0, tp as _) as *mut GuestTimeSpec;