+#if defined(__MACH__) && !defined(__gnu_hurd__)
+/* 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__ */
+