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 --- CMakeLists.txt | 1 + configure.ac | 1 + lib/curl_config.h.cmake | 3 +++ lib/timeval.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c41759aa1..3aaeb346e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -878,6 +878,7 @@ check_symbol_exists(setrlimit "${CURL_INCLUDES}" HAVE_SETRLIMIT) check_symbol_exists(fcntl "${CURL_INCLUDES}" HAVE_FCNTL) check_symbol_exists(ioctl "${CURL_INCLUDES}" HAVE_IOCTL) check_symbol_exists(setsockopt "${CURL_INCLUDES}" HAVE_SETSOCKOPT) +check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME) # symbol exists in win32, but function does not. if(WIN32) diff --git a/configure.ac b/configure.ac index 68b3a071a..5272feaa0 100755 --- a/configure.ac +++ b/configure.ac @@ -3385,6 +3385,7 @@ AC_CHECK_FUNCS([geteuid \ getrlimit \ gettimeofday \ if_nametoindex \ + mach_absolute_time \ pipe \ setlocale \ setmode \ 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.1