From: Yann Collet Date: Fri, 13 Jan 2023 04:45:11 +0000 (-0800) Subject: restore support of clock_gettime() for POSIX systems X-Git-Tag: v1.5.4^2~50^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a2ef23dec03a18978dc945cee557d280160f8cb6;p=thirdparty%2Fzstd.git restore support of clock_gettime() for POSIX systems This should notably allow posix systems with timespec_get() to have access to a high resolution timer, instead of falling back to C90's clock_t. --- diff --git a/programs/timefn.c b/programs/timefn.c index 023e2136c..f941e57e6 100644 --- a/programs/timefn.c +++ b/programs/timefn.c @@ -12,8 +12,8 @@ /* === Dependencies === */ #include "timefn.h" - -#include /* TIME_UTC, then struct timespec and clock_t */ +#include "platform.h" /* set _POSIX_C_SOURCE */ +#include /* CLOCK_MONOTONIC, TIME_UTC */ /*-**************************************** * Time functions @@ -37,8 +37,10 @@ UTIL_time_t UTIL_getTime(void) init = 1; } { UTIL_time_t r; - r.t = (PTime)(QueryPerformanceCounter(&x).QuadPart * 1000000000ULL / ticksPerSecond.QuadPart); - return ; + LARGE_INTEGER x; + QueryPerformanceCounter(&x); + r.t = (PTime)(x.QuadPart * 1000000000ULL / ticksPerSecond.QuadPart); + return r; } } @@ -61,10 +63,31 @@ UTIL_time_t UTIL_getTime(void) } } +/* POSIX.1-2001 (optional) */ +#elif defined(CLOCK_MONOTONIC) + +#include /* abort */ +#include /* perror */ + +UTIL_time_t UTIL_getTime(void) +{ + /* time must be initialized, othersize it may fail msan test. + * No good reason, likely a limitation of timespec_get() for some target */ + struct timespec time = { 0, 0 }; + if (clock_gettime(CLOCK_MONOTONIC, &time) != 0) { + perror("timefn::clock_gettime(CLOCK_MONOTONIC)"); + abort(); + } + { UTIL_time_t r; + r.t = (PTime)time.tv_sec * 1000000000ULL + (PTime)time.tv_nsec; + return r; + } +} + -/* C11 requires timespec_get(). - * However, FreeBSD 11 claims C11 compliance but lacks timespec_get(). - * Double confirm by requiring the definition of TIME_UTC. +/* C11 requires support of timespec_get(). + * However, FreeBSD 11 claims C11 compliance while lacking timespec_get(). + * Double confirm timespec_get() support by checking the definition of TIME_UTC. * However, some versions of Android manage to simultanously define TIME_UTC * and lack timespec_get() support... */ #elif (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */) \ @@ -79,7 +102,7 @@ UTIL_time_t UTIL_getTime(void) * No good reason, likely a limitation of timespec_get() for some target */ struct timespec time = { 0, 0 }; if (timespec_get(&time, TIME_UTC) != TIME_UTC) { - perror("timefn::timespec_get"); + perror("timefn::timespec_get(TIME_UTC)"); abort(); } { UTIL_time_t r;