| 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)
|
|
|