Index: base/time_posix.cc |
=================================================================== |
--- base/time_posix.cc (revision 4473) |
+++ base/time_posix.cc (working copy) |
@@ -4,6 +4,9 @@ |
#include "base/time.h" |
+#ifdef OS_MACOSX |
+#include <mach/mach_time.h> |
+#endif |
#include <sys/time.h> |
#include <time.h> |
@@ -89,7 +92,32 @@ |
TimeTicks TimeTicks::Now() { |
uint64_t absolute_micro; |
-#if defined(OS_POSIX) && \ |
+#if defined(OS_MACOSX) |
+ static mach_timebase_info_data_t timebase_info; |
+ if (timebase_info.denom == 0) { |
+ // Zero-initialization of statics guarantees that denom will be 0 before |
+ // calling mach_timebase_info. mach_timebase_info will never set denom to |
+ // 0 as that would be invalid, so the zero-check can be used to determine |
+ // whether mach_timebase_info has already been called. This is |
+ // recommended by Apple's QA1398. |
+ kern_return_t kr = mach_timebase_info(&timebase_info); |
+ DCHECK(kr == KERN_SUCCESS); |
+ } |
+ |
+ // mach_absolute_time is it when it comes to ticks on the Mac. Other calls |
+ // with less precision (such as TickCount) just call through to |
+ // mach_absolute_time. |
+ |
+ // timebase_info converts absolute time tick units into nanoseconds. Convert |
+ // to microseconds up front to stave off overflows. |
+ absolute_micro = mach_absolute_time() / Time::kNanosecondsPerMicrosecond * |
+ timebase_info.numer / timebase_info.denom; |
+ |
+ // Don't bother with the rollover handling that the Windows version does. |
+ // With numer and denom = 1 (the expected case), the 64-bit absolute time |
+ // reported in nanoseconds is enough to last nearly 585 years. |
+ |
+#elif defined(OS_POSIX) && \ |
defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 |
struct timespec ts; |