-# 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;
+# 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;