From 3eab3290426a8847910cc1e7ba76a161ae286220 Mon Sep 17 00:00:00 2001 From: Bryan Christianson Date: Fri, 13 Mar 2020 08:33:00 +1300 Subject: [PATCH] sys_macosx: don't require clock_gettime() Earlier versions of macOS do not provide clock_gettime(). This patch checks for clock_gettime() at run-time and falls back to gettimeofday() if the symbol is not present. --- sys_macosx.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/sys_macosx.c b/sys_macosx.c index 807d62e..701c078 100644 --- a/sys_macosx.c +++ b/sys_macosx.c @@ -451,6 +451,39 @@ legacy_MacOSX_Finalise(void) /* ================================================== */ +#if HAVE_CLOCK_GETTIME +int +clock_gettime(clockid_t clock_id, struct timespec *ts) +{ + /* Check that the system clock_gettime symbol is actually present before + attempting to call it. The symbol is available in macOS 10.12 + and later. */ + + static int init = 0; + static int (*sys_clock_gettime)(clockid_t, struct timespec *) = NULL; + int ret = 0; + + if (!init) { + sys_clock_gettime = dlsym(RTLD_NEXT, "clock_gettime"); + init = 1; + } + + if (sys_clock_gettime != NULL) { + ret = sys_clock_gettime(clock_id, ts); + } else { + struct timeval tv; + + if (gettimeofday(&tv, NULL) < 0) + LOG_FATAL("gettimeofday() failed : %s", strerror(errno)); + + UTI_TimevalToTimespec(&tv, ts); + } + return ret; +} +#endif + +/* ================================================== */ + void SYS_MacOSX_Initialise(void) {