diff options
author | Christian Göttsche <cgzones@googlemail.com> | 2020-12-13 13:16:44 +0100 |
---|---|---|
committer | BenBE <BenBE@geshi.org> | 2020-12-18 22:43:21 +0100 |
commit | 26993d2d2b2be391adbfaa2ee53ee3e77f323b28 (patch) | |
tree | 574d7584b410a403bbf5ca89cd01ec3c3290ac64 | |
parent | 0401df8cbd3193a43e616e36244e0811376afbfd (diff) |
Support clock_gettime() on OSX El Capitan and earlier
-rw-r--r-- | Compat.c | 34 | ||||
-rw-r--r-- | Compat.h | 2 | ||||
-rw-r--r-- | ProcessList.c | 6 | ||||
-rw-r--r-- | configure.ac | 2 |
4 files changed, 41 insertions, 3 deletions
@@ -11,12 +11,18 @@ in the source distribution for its full text. #include <errno.h> #include <fcntl.h> // IWYU pragma: keep +#include <time.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> // IWYU pragma: keep #include "XUtils.h" // IWYU pragma: keep +#ifdef HAVE_HOST_GET_CLOCK_SERVICE +#include <mach/clock.h> +#include <mach/mach.h> +#endif + int Compat_faccessat(int dirfd, const char* pathname, @@ -117,3 +123,31 @@ ssize_t Compat_readlinkat(int dirfd, #endif } + +int Compat_clock_monotonic_gettime(struct timespec *tp) { + +#if defined(HAVE_CLOCK_GETTIME) + + return clock_gettime(CLOCK_MONOTONIC, tp); + +#elif defined(HAVE_HOST_GET_CLOCK_SERVICE) + + clock_serv_t cclock; + mach_timespec_t mts; + + host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + + tp->tv_sec = mts.tv_sec; + tp->tv_nsec = mts.tv_nsec; + + return 0; + +#else + +#error No Compat_clock_monotonic_gettime() implementation! + +#endif + +} @@ -56,4 +56,6 @@ ssize_t Compat_readlinkat(int dirfd, char* buf, size_t bufsize); +int Compat_clock_monotonic_gettime(struct timespec *tp); + #endif /* HEADER_Compat */ diff --git a/ProcessList.c b/ProcessList.c index a12e8534..b7800e49 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -10,8 +10,8 @@ in the source distribution for its full text. #include <assert.h> #include <stdlib.h> #include <string.h> -#include <time.h> +#include "Compat.h" #include "CRT.h" #include "Hashtable.h" #include "Macros.h" @@ -538,8 +538,8 @@ void ProcessList_scan(ProcessList* this, bool pauseProcessUpdate) { if (!firstScanDone) { this->scanTs = 0; firstScanDone = true; - } else if (clock_gettime(CLOCK_MONOTONIC, &now) == 0) { - this->scanTs = now.tv_sec; + } else if (Compat_clock_monotonic_gettime(&now) == 0) { + this->scanTs = now.tv_sec + now.tv_nsec / 1000000000; } ProcessList_goThroughEntries(this, false); diff --git a/configure.ac b/configure.ac index a5b7093a..5c39b405 100644 --- a/configure.ac +++ b/configure.ac @@ -93,8 +93,10 @@ AC_TYPE_UINT64_T AC_FUNC_CLOSEDIR_VOID AC_FUNC_STAT AC_CHECK_FUNCS([\ + clock_gettime\ faccessat\ fstatat\ + host_get_clock_service\ openat\ readlinkat\ ]) |