|
@@ -84,18 +84,46 @@
|
|
|
|
|
|
#ifdef __MACH__
|
|
|
|
|
|
-#define CLOCK_REALTIME 0
|
|
|
-#define CLOCK_MONOTONIC 0
|
|
|
+#define CLOCK_MONOTONIC (1)
|
|
|
+#define CLOCK_REALTIME (2)
|
|
|
|
|
|
#include <sys/time.h>
|
|
|
+#include <mach/clock.h>
|
|
|
+#include <mach/mach.h>
|
|
|
+
|
|
|
//clock_gettime is not implemented on OSX
|
|
|
int clock_gettime(int clk_id, struct timespec* t) {
|
|
|
- struct timeval now;
|
|
|
- int rv = gettimeofday(&now, NULL);
|
|
|
- if (rv) return rv;
|
|
|
- t->tv_sec = now.tv_sec;
|
|
|
- t->tv_nsec = now.tv_usec * 1000;
|
|
|
- return 0;
|
|
|
+
|
|
|
+ if (clk_id == CLOCK_REALTIME) {
|
|
|
+
|
|
|
+ struct timeval now;
|
|
|
+ int rv = gettimeofday(&now, NULL);
|
|
|
+ if (rv) return rv;
|
|
|
+ t->tv_sec = now.tv_sec;
|
|
|
+ t->tv_nsec = now.tv_usec * 1000;
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ } else if (clk_id == CLOCK_MONOTONIC) {
|
|
|
+
|
|
|
+ static uint64_t start_time = 0;
|
|
|
+ static mach_timebase_info_data_t timebase_ifo = {0};
|
|
|
+
|
|
|
+ uint64_t now = mach_absolute_time();
|
|
|
+
|
|
|
+ if (start_time == 0) {
|
|
|
+ kern_return_t mach_status = mach_timebase_info(&timebase_ifo);
|
|
|
+ assert(mach_status == KERN_SUCCESS);
|
|
|
+ start_time = now;
|
|
|
+ }
|
|
|
+
|
|
|
+ now = (uint64_t)((double)(now - start_time) * (double)timebase_ifo.numer/(double)timebase_ifo.denom);
|
|
|
+
|
|
|
+ t->tv_sec = now / 1000000000;
|
|
|
+ t->tv_nsec = now % 1000000000;
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ }
|
|
|
+ return -1; /* EINVAL - Clock ID is unknown */
|
|
|
}
|
|
|
#endif
|
|
|
|