From 1ecd5f8f21bbf35cb3f840944823d9d8f6de1eb6 Mon Sep 17 00:00:00 2001 From: Moses Miller Date: Thu, 10 May 2018 20:31:35 -0700 Subject: [PATCH 1/6] Implement clock() and add CLOCK_* constants --- src/time/src/constants.rs | 5 +++++ src/time/src/lib.rs | 19 +++++++++++++++++-- tests/time.c | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/time/src/constants.rs b/src/time/src/constants.rs index a7c1aa0d3b..1836c7cec9 100644 --- a/src/time/src/constants.rs +++ b/src/time/src/constants.rs @@ -42,3 +42,8 @@ pub(crate) const DAY_NAMES: [&str; 7] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri pub(crate) const MON_NAMES: [&str; 12] = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; + +pub(crate) const CLOCK_REALTIME: clockid_t = 0; +pub(crate) const CLOCK_MONOTONIC: clockid_t = 1; +pub(crate) const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2; +pub(crate) const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3; diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs index cd338df101..2ae68ffd56 100644 --- a/src/time/src/lib.rs +++ b/src/time/src/lib.rs @@ -12,7 +12,6 @@ mod helpers; use platform::types::*; use constants::*; use helpers::*; -use core::fmt::write; use core::mem::transmute; use errno::EIO; @@ -99,7 +98,23 @@ pub extern "C" fn asctime_r(tm: *const tm, buf: *mut c_char) -> *mut c_char { #[no_mangle] pub extern "C" fn clock() -> clock_t { - unimplemented!(); + let mut ts: timespec; + + unsafe { + ts = core::mem::uninitialized(); + } + + if clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &mut ts) != 0 { + return -1; + } + + if ts.tv_sec > time_t::max_value() / 1000000 + || ts.tv_nsec / 1000 > time_t::max_value() - 1000000 * ts.tv_sec + { + return -1; + } + + return ts.tv_sec * 1_000_000 + ts.tv_nsec / 1000; } #[no_mangle] diff --git a/tests/time.c b/tests/time.c index e6ce164c25..5c60f4a4c3 100644 --- a/tests/time.c +++ b/tests/time.c @@ -7,5 +7,7 @@ int main(int argc, char** argv) { perror("clock_gettime"); time(NULL); perror("time"); + clock_t c = clock(); + perror("clock"); return 0; } From 56458e5e4c5cb5eae401fd3560865883eca65b03 Mon Sep 17 00:00:00 2001 From: Moses Miller Date: Thu, 10 May 2018 20:48:13 -0700 Subject: [PATCH 2/6] Condense 5 lines into 1 --- src/time/src/lib.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs index 2ae68ffd56..f94c39d756 100644 --- a/src/time/src/lib.rs +++ b/src/time/src/lib.rs @@ -98,11 +98,7 @@ pub extern "C" fn asctime_r(tm: *const tm, buf: *mut c_char) -> *mut c_char { #[no_mangle] pub extern "C" fn clock() -> clock_t { - let mut ts: timespec; - - unsafe { - ts = core::mem::uninitialized(); - } + let mut ts: timespec = unsafe { core::mem::uninitialized() }; if clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &mut ts) != 0 { return -1; From 9d8758006da0c07cb056582eae913c3632448a1d Mon Sep 17 00:00:00 2001 From: Moses Miller Date: Fri, 11 May 2018 11:41:18 -0700 Subject: [PATCH 3/6] Change 1000000 to 1_000_000 --- src/time/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs index f94c39d756..58d862ff37 100644 --- a/src/time/src/lib.rs +++ b/src/time/src/lib.rs @@ -104,8 +104,8 @@ pub extern "C" fn clock() -> clock_t { return -1; } - if ts.tv_sec > time_t::max_value() / 1000000 - || ts.tv_nsec / 1000 > time_t::max_value() - 1000000 * ts.tv_sec + if ts.tv_sec > time_t::max_value() / 1_000_000 + || ts.tv_nsec / 1000 > time_t::max_value() - 1_000_000 * ts.tv_sec { return -1; } From 3d1a66f270bd0edd36469a7389efddcacd313bf1 Mon Sep 17 00:00:00 2001 From: Moses Miller Date: Fri, 11 May 2018 16:26:56 -0700 Subject: [PATCH 4/6] Add CLOCKS_PER_SEC --- src/time/src/constants.rs | 2 ++ src/time/src/lib.rs | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/time/src/constants.rs b/src/time/src/constants.rs index 1836c7cec9..fe6eae8e3d 100644 --- a/src/time/src/constants.rs +++ b/src/time/src/constants.rs @@ -47,3 +47,5 @@ pub(crate) const CLOCK_REALTIME: clockid_t = 0; pub(crate) const CLOCK_MONOTONIC: clockid_t = 1; pub(crate) const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2; pub(crate) const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3; + +pub(crate) const CLOCKS_PER_SEC: time_t = 1_000_000; \ No newline at end of file diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs index 58d862ff37..e93f4c752a 100644 --- a/src/time/src/lib.rs +++ b/src/time/src/lib.rs @@ -104,13 +104,13 @@ pub extern "C" fn clock() -> clock_t { return -1; } - if ts.tv_sec > time_t::max_value() / 1_000_000 - || ts.tv_nsec / 1000 > time_t::max_value() - 1_000_000 * ts.tv_sec + if ts.tv_sec > time_t::max_value() / CLOCKS_PER_SEC + || ts.tv_nsec / 1000 > time_t::max_value() - CLOCKS_PER_SEC * ts.tv_sec { return -1; } - return ts.tv_sec * 1_000_000 + ts.tv_nsec / 1000; + return ts.tv_sec * CLOCKS_PER_SEC + ts.tv_nsec / 1000; } #[no_mangle] From 766e00c69e00a050a42b811797c2e2114c5fdb71 Mon Sep 17 00:00:00 2001 From: Moses Miller Date: Fri, 11 May 2018 17:22:01 -0700 Subject: [PATCH 5/6] Implement conversion of nanoseconds to clocks in terms of CLOCKS_PER_SEC --- src/time/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs index e93f4c752a..32cc4ef7c5 100644 --- a/src/time/src/lib.rs +++ b/src/time/src/lib.rs @@ -105,12 +105,12 @@ pub extern "C" fn clock() -> clock_t { } if ts.tv_sec > time_t::max_value() / CLOCKS_PER_SEC - || ts.tv_nsec / 1000 > time_t::max_value() - CLOCKS_PER_SEC * ts.tv_sec + || ts.tv_nsec / (1_000_000_000 / CLOCKS_PER_SEC) > time_t::max_value() - CLOCKS_PER_SEC * ts.tv_sec { return -1; } - return ts.tv_sec * CLOCKS_PER_SEC + ts.tv_nsec / 1000; + return ts.tv_sec * CLOCKS_PER_SEC + ts.tv_nsec / (1_000_000_000 / CLOCKS_PER_SEC); } #[no_mangle] From d14d0b5965bb7f2cb980bb6a9db37d4e46499869 Mon Sep 17 00:00:00 2001 From: Moses Miller Date: Fri, 11 May 2018 18:02:46 -0700 Subject: [PATCH 6/6] Fix various formatting issues --- src/time/src/constants.rs | 2 +- src/time/src/lib.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/time/src/constants.rs b/src/time/src/constants.rs index fe6eae8e3d..becfaaceb9 100644 --- a/src/time/src/constants.rs +++ b/src/time/src/constants.rs @@ -48,4 +48,4 @@ pub(crate) const CLOCK_MONOTONIC: clockid_t = 1; pub(crate) const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2; pub(crate) const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3; -pub(crate) const CLOCKS_PER_SEC: time_t = 1_000_000; \ No newline at end of file +pub(crate) const CLOCKS_PER_SEC: time_t = 1_000_000; diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs index 32cc4ef7c5..48a301215f 100644 --- a/src/time/src/lib.rs +++ b/src/time/src/lib.rs @@ -105,7 +105,8 @@ pub extern "C" fn clock() -> clock_t { } if ts.tv_sec > time_t::max_value() / CLOCKS_PER_SEC - || ts.tv_nsec / (1_000_000_000 / CLOCKS_PER_SEC) > time_t::max_value() - CLOCKS_PER_SEC * ts.tv_sec + || ts.tv_nsec / (1_000_000_000 / CLOCKS_PER_SEC) + > time_t::max_value() - CLOCKS_PER_SEC * ts.tv_sec { return -1; }