clock_gettime with time crate and test

more lint
This commit is contained in:
Mackenzie Clark 2018-12-26 16:55:53 -08:00
parent 71a0315171
commit 4813047d37
9 changed files with 48 additions and 17 deletions

12
Cargo.lock generated
View File

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

View File

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

View File

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

10
emtests/clock_gettime.c Normal file
View File

@ -0,0 +1,10 @@
#include <stdio.h>
#include <time.h>
// 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");
}

View File

@ -0,0 +1 @@
clock_gettime

BIN
emtests/clock_gettime.wasm Normal file

Binary file not shown.

View File

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

View File

@ -0,0 +1,9 @@
#[test]
fn test_clock_gettime() {
assert_emscripten_output!(
"../../emtests/clock_gettime.wasm",
"clock_gettime",
vec![],
"../../emtests/clock_gettime.output"
);
}

View File

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