|
@@ -87,14 +87,43 @@ void os_sleep_ms(uint32_t duration)
|
|
|
usleep(duration*1000);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/* clock function selection taken from libc++ */
|
|
|
+static uint64_t ns_time_simple()
|
|
|
+{
|
|
|
+ return mach_absolute_time();
|
|
|
+}
|
|
|
+
|
|
|
+static double ns_time_compute_factor()
|
|
|
+{
|
|
|
+ mach_timebase_info_data_t info = {1, 1};
|
|
|
+ mach_timebase_info(&info);
|
|
|
+ return ((double)info.numer) / info.denom;
|
|
|
+}
|
|
|
+
|
|
|
+static uint64_t ns_time_full()
|
|
|
+{
|
|
|
+ static double factor = 0.;
|
|
|
+ if (factor == 0.) factor = ns_time_compute_factor();
|
|
|
+ return (uint64_t)(mach_absolute_time() * factor);
|
|
|
+}
|
|
|
+
|
|
|
+typedef uint64_t (*time_func)();
|
|
|
+
|
|
|
+static time_func ns_time_select_func()
|
|
|
+{
|
|
|
+ mach_timebase_info_data_t info = {1, 1};
|
|
|
+ mach_timebase_info(&info);
|
|
|
+ if (info.denom == info.numer)
|
|
|
+ return ns_time_simple;
|
|
|
+ return ns_time_full;
|
|
|
+}
|
|
|
+
|
|
|
uint64_t os_gettime_ns(void)
|
|
|
{
|
|
|
- uint64_t t = mach_absolute_time();
|
|
|
-#pragma clang diagnostic push
|
|
|
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
|
- Nanoseconds nano = AbsoluteToNanoseconds(*(AbsoluteTime*) &t);
|
|
|
-#pragma clang diagnostic pop
|
|
|
- return *(uint64_t*) &nano;
|
|
|
+ static time_func f = NULL;
|
|
|
+ if (!f) f = ns_time_select_func();
|
|
|
+ return f();
|
|
|
}
|
|
|
|
|
|
/* gets the location ~/Library/Application Support/[name] */
|