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.
---
local.c | 4 ++++
sys_macosx.c | 25 +++++++++++++++++++++++++
sys_macosx.h | 1 +
3 files changed, 30 insertions(+)
diff --git a/local.c b/local.c
index b4baaac..85b0dd6 100644
--- a/local.c
+++ b/local.c
@@ -357,6 +357,10 @@ void
LCL_ReadRawTime(struct timespec *ts)
{
#if HAVE_CLOCK_GETTIME
+#ifdef MACOSX
+ SYS_MacOSX_GetTime(CLOCK_REALTIME, ts);
+ return;
+#endif
if (clock_gettime(CLOCK_REALTIME, ts) < 0)
LOG_FATAL("clock_gettime() failed : %s", strerror(errno));
#else
diff --git a/sys_macosx.c b/sys_macosx.c
index 807d62e..717ff5d 100644
--- a/sys_macosx.c
+++ b/sys_macosx.c
@@ -451,6 +451,31 @@ legacy_MacOSX_Finalise(void)
/* ================================================== */
+void
+SYS_MacOSX_GetTime(clockid_t clock_id, struct timespec *ts)
+{
+ static int init = 0;
+ static int (*sys_clock_gettime)(clockid_t, struct timespec *) = NULL;
+
+ if (!init) {
+ sys_clock_gettime = dlsym(RTLD_NEXT, "clock_gettime");
+ init = 1;
+ }
+ if (sys_clock_gettime != NULL) {
+ if (sys_clock_gettime(CLOCK_REALTIME, ts) < 0)
+ LOG_FATAL("clock_gettime() failed : %s", strerror(errno));
+ } else {
+ struct timeval tv;
+
+ if (gettimeofday(&tv, NULL) < 0)
+ LOG_FATAL("gettimeofday() failed : %s", strerror(errno));
+
+ UTI_TimevalToTimespec(&tv, ts);
+ }
+}
+
+/* ================================================== */
+
void
SYS_MacOSX_Initialise(void)
{
diff --git a/sys_macosx.h b/sys_macosx.h
index 5555616..c3c44b2 100644
--- a/sys_macosx.h
+++ b/sys_macosx.h
@@ -34,5 +34,6 @@ void SYS_MacOSX_SetScheduler(int SchedPriority);
void SYS_MacOSX_DropRoot(uid_t uid, gid_t gid);
void SYS_MacOSX_Initialise(void);
void SYS_MacOSX_Finalise(void);
+void SYS_MacOSX_GetTime(clockid_t clock_id, struct timespec *ts);
#endif
--
2.21.1 (Apple Git-122.3)
--
To unsubscribe email [email protected] with "unsubscribe"
in the subject.
For help email [email protected] with "help" in the
subject.
Trouble? Email [email protected].