Browse Source

Use libc++ inspired clock instead of the deprecated AbsoluteToNanoseconds

This also makes the clang static analyzer happy (it complained about
uninitialized fields in the AbsoluteTime struct)
Palana 11 years ago
parent
commit
c86fa7bb30
1 changed files with 35 additions and 6 deletions
  1. 35 6
      libobs/util/platform-cocoa.m

+ 35 - 6
libobs/util/platform-cocoa.m

@@ -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] */