diff options
author | Dmitri Tikhonov <dtikhonov@live.com> | 2017-10-30 08:12:41 -0400 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2017-10-30 15:27:46 +0100 |
commit | d531f33ba2210ef11d0849bc73654e03affd0cfa (patch) | |
tree | 70360646ecedccbf1a5579bbe7711152c746fbc6 | |
parent | e240a546a7ac2fa7956adb664b8c40c4dee4f82b (diff) |
timeval: use mach time on MacOS
If clock_gettime() is not supported, use mach_absolute_time() on MacOS.
closes #2033
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rwxr-xr-x | configure.ac | 1 | ||||
-rw-r--r-- | lib/curl_config.h.cmake | 3 | ||||
-rw-r--r-- | lib/timeval.c | 31 |
4 files changed, 36 insertions, 0 deletions
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 <stdint.h> +#include <mach/mach_time.h> + +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) |