Index: base/time/time_mac.cc |
diff --git a/base/time/time_mac.cc b/base/time/time_mac.cc |
index 8f589166f0e343d6b3ec5053519b3a8ef7d4be61..5803acd35117c175fc43067ac59ce880ee0197b2 100644 |
--- a/base/time/time_mac.cc |
+++ b/base/time/time_mac.cc |
@@ -25,22 +25,8 @@ |
namespace { |
-int64_t ComputeCurrentTicks() { |
-#if defined(OS_IOS) |
- // On iOS mach_absolute_time stops while the device is sleeping. Instead use |
- // now - KERN_BOOTTIME to get a time difference that is not impacted by clock |
- // changes. KERN_BOOTTIME will be updated by the system whenever the system |
- // clock change. |
- struct timeval boottime; |
- int mib[2] = {CTL_KERN, KERN_BOOTTIME}; |
- size_t size = sizeof(boottime); |
- int kr = sysctl(mib, arraysize(mib), &boottime, &size, nullptr, 0); |
- DCHECK_EQ(KERN_SUCCESS, kr); |
- base::TimeDelta time_difference = base::Time::Now() - |
- (base::Time::FromTimeT(boottime.tv_sec) + |
- base::TimeDelta::FromMicroseconds(boottime.tv_usec)); |
- return time_difference.InMicroseconds(); |
-#else |
+#if defined(OS_MACOSX) && !defined(OS_IOS) |
+int64_t MachAbsoluteTimeToTicks(uint64_t mach_absolute_time) { |
static mach_timebase_info_data_t timebase_info; |
if (timebase_info.denom == 0) { |
// Zero-initialization of statics guarantees that denom will be 0 before |
@@ -52,14 +38,10 @@ int64_t ComputeCurrentTicks() { |
MACH_DCHECK(kr == KERN_SUCCESS, kr) << "mach_timebase_info"; |
} |
- // 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. |
- base::CheckedNumeric<uint64_t> result( |
- mach_absolute_time() / base::Time::kNanosecondsPerMicrosecond); |
+ base::CheckedNumeric<uint64_t> result(mach_absolute_time / |
+ base::Time::kNanosecondsPerMicrosecond); |
result *= timebase_info.numer; |
result /= timebase_info.denom; |
@@ -67,6 +49,29 @@ int64_t ComputeCurrentTicks() { |
// With numer and denom = 1 (the expected case), the 64-bit absolute time |
// reported in nanoseconds is enough to last nearly 585 years. |
return base::checked_cast<int64_t>(result.ValueOrDie()); |
+} |
+#endif // defined(OS_MACOSX) && !defined(OS_IOS) |
+ |
+int64_t ComputeCurrentTicks() { |
+#if defined(OS_IOS) |
+ // On iOS mach_absolute_time stops while the device is sleeping. Instead use |
+ // now - KERN_BOOTTIME to get a time difference that is not impacted by clock |
+ // changes. KERN_BOOTTIME will be updated by the system whenever the system |
+ // clock change. |
+ struct timeval boottime; |
+ int mib[2] = {CTL_KERN, KERN_BOOTTIME}; |
+ size_t size = sizeof(boottime); |
+ int kr = sysctl(mib, arraysize(mib), &boottime, &size, nullptr, 0); |
+ DCHECK_EQ(KERN_SUCCESS, kr); |
+ base::TimeDelta time_difference = |
+ base::Time::Now() - (base::Time::FromTimeT(boottime.tv_sec) + |
+ base::TimeDelta::FromMicroseconds(boottime.tv_usec)); |
+ return time_difference.InMicroseconds(); |
+#else |
+ // 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. |
+ return MachAbsoluteTimeToTicks(mach_absolute_time()); |
#endif // defined(OS_IOS) |
} |
@@ -263,6 +268,13 @@ bool TimeTicks::IsConsistentAcrossProcesses() { |
return true; |
} |
+#if defined(OS_MACOSX) && !defined(OS_IOS) |
+// static |
+TimeTicks TimeTicks::FromMachAbsoluteTime(uint64_t mach_absolute_time) { |
+ return TimeTicks(MachAbsoluteTimeToTicks(mach_absolute_time)); |
+} |
+#endif // defined(OS_MACOSX) && !defined(OS_IOS) |
+ |
// static |
TimeTicks::Clock TimeTicks::GetClock() { |
#if defined(OS_IOS) |