From d531f33ba2210ef11d0849bc73654e03affd0cfa Mon Sep 17 00:00:00 2001 From: Dmitri Tikhonov Date: Mon, 30 Oct 2017 08:12:41 -0400 Subject: timeval: use mach time on MacOS If clock_gettime() is not supported, use mach_absolute_time() on MacOS. closes #2033 --- lib/curl_config.h.cmake | 3 +++ lib/timeval.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) (limited to 'lib') diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake index c80484f65..e4d14c784 100644 --- a/lib/curl_config.h.cmake +++ b/lib/curl_config.h.cmake @@ -1000,3 +1000,6 @@ /* the signed version of size_t */ #cmakedefine ssize_t ${ssize_t} + +/* Define to 1 if you have the mach_absolute_time function. */ +#cmakedefine HAVE_MACH_ABSOLUTE_TIME 1 diff --git a/lib/timeval.c b/lib/timeval.c index 4f630bafc..66f923a8e 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -84,6 +84,37 @@ struct curltime Curl_now(void) return cnow; } +#elif defined(HAVE_MACH_ABSOLUTE_TIME) + +#include +#include + +struct curltime Curl_now(void) +{ + /* + ** Monotonic timer on Mac OS is provided by mach_absolute_time(), which + ** returns time in Mach "absolute time units," which are platform-dependent. + ** To convert to nanoseconds, one must use conversion factors specified by + ** mach_timebase_info(). + */ + static mach_timebase_info_data_t timebase; + struct curltime cnow; + uint64_t usecs; + + if(0 == timebase.denom) + (void) mach_timebase_info(&timebase); + + usecs = mach_absolute_time(); + usecs *= timebase.numer; + usecs /= timebase.denom; + usecs /= 1000; + + cnow.tv_sec = usecs / 1000000; + cnow.tv_usec = usecs % 1000000; + + return cnow; +} + #elif defined(HAVE_GETTIMEOFDAY) struct curltime Curl_now(void) -- cgit v1.2.3