Fake up clock_gettime() on OS X.
authorEmil Mikulic <emikulic@gmail.com>
Sun, 11 Aug 2013 13:11:09 +0000 (23:11 +1000)
committerEmil Mikulic <emikulic@gmail.com>
Wed, 14 Aug 2013 09:05:14 +0000 (19:05 +1000)
Thanks to Tim Bradshaw for reporting this and testing patches.

now.c

diff --git a/now.c b/now.c
index 6e003c4..f0751a8 100644 (file)
--- a/now.c
+++ b/now.c
 #include <string.h>
 #include <time.h>
 
+#ifdef __MACH__
+/* Fake up clock_gettime() on OS X. */
+# include <sys/time.h>
+# include <inttypes.h>
+# include <mach/mach.h>
+# include <mach/mach_time.h>
+
+typedef int clockid_t;
+#define CLOCK_REALTIME 0
+#define CLOCK_MONOTONIC 1
+
+static uint64_t mono_first = 0;
+
+int clock_gettime(clockid_t clk_id, struct timespec *tp) {
+   if (clk_id == CLOCK_REALTIME) {
+      struct timeval tv;
+      gettimeofday(&tv, NULL);
+      tp->tv_sec = tv.tv_sec;
+      tp->tv_nsec = tv.tv_usec * 1000;
+      return 0;
+   }
+   if (clk_id == CLOCK_MONOTONIC) {
+      uint64_t t = mach_absolute_time();
+      mach_timebase_info_data_t timebase;
+      mach_timebase_info(&timebase);
+      if (!mono_first) {
+         mono_first = t;
+      }
+      uint64_t tdiff = (t - mono_first) * timebase.numer / timebase.denom;
+      tp->tv_sec = tdiff / 1000000000;
+      tp->tv_nsec = tdiff % 1000000000;
+      return 0;
+   }
+   return -1;
+}
+#endif  /* __MACH__ */
+
 static struct timespec clock_real, clock_mono;
 static int now_initialized = 0;