diff --git a/libc/bionic/clock.cpp b/libc/bionic/clock.cpp index a2636c67c..053e9e742 100644 --- a/libc/bionic/clock.cpp +++ b/libc/bionic/clock.cpp @@ -30,12 +30,13 @@ #include #include +#include "private/bionic_constants.h" + // http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock.html clock_t clock() { - tms t; - times(&t); - // Although times(2) and clock(3) both use the type clock_t, the units are - // different. For times(2) it's pure clock ticks, but for clock(3) the unit - // is CLOCKS_PER_SEC, so we need to scale appropriately. - return (t.tms_utime + t.tms_stime) * (CLOCKS_PER_SEC / sysconf(_SC_CLK_TCK)); + timespec ts; + if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) == -1) { + return -1; + } + return (ts.tv_sec * CLOCKS_PER_SEC) + (ts.tv_nsec / (NS_PER_S / CLOCKS_PER_SEC)); } diff --git a/tests/time_test.cpp b/tests/time_test.cpp index c631b6adb..d2fec9ae9 100644 --- a/tests/time_test.cpp +++ b/tests/time_test.cpp @@ -404,3 +404,11 @@ TEST(time, clock_gettime) { ASSERT_EQ(0, ts2.tv_sec); ASSERT_LT(ts2.tv_nsec, 1000000); } + +TEST(time, clock) { + // clock(3) is hard to test, but a 1s sleep should cost less than 1ms. + clock_t t0 = clock(); + sleep(1); + clock_t t1 = clock(); + ASSERT_LT(t1 - t0, CLOCKS_PER_SEC / 1000); +}