Explorar o código

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 %!s(int64=11) %!d(string=hai) anos
pai
achega
c86fa7bb30
Modificáronse 1 ficheiros con 35 adicións e 6 borrados
  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] */