| Index: base/time/time_win.cc
|
| diff --git a/base/time/time_win.cc b/base/time/time_win.cc
|
| index cf7be687d2e5a0b292414796f1b3c25e2535f518..5fa899d1f97f69be69d1df65ba854565d7240b53 100644
|
| --- a/base/time/time_win.cc
|
| +++ b/base/time/time_win.cc
|
| @@ -393,11 +393,14 @@ class HighResNowSingleton {
|
| int64 QPCValueToMicroseconds(LONGLONG qpc_value) {
|
| if (!ticks_per_second_)
|
| return 0;
|
| -
|
| - // Intentionally calculate microseconds in a round about manner to avoid
|
| - // overflow and precision issues. Think twice before simplifying!
|
| + // If the QPC Value is below the overflow threshold, we proceed with
|
| + // simple multiply and divide.
|
| + if (qpc_value < Time::kQPCOverflowThreshold)
|
| + return qpc_value * Time::kMicrosecondsPerSecond / ticks_per_second_;
|
| + // Otherwise, calculate microseconds in a round about manner to avoid
|
| + // overflow and precision issues.
|
| int64 whole_seconds = qpc_value / ticks_per_second_;
|
| - int64 leftover_ticks = qpc_value % ticks_per_second_;
|
| + int64 leftover_ticks = qpc_value - (whole_seconds * ticks_per_second_);
|
| int64 microseconds = (whole_seconds * Time::kMicrosecondsPerSecond) +
|
| ((leftover_ticks * Time::kMicrosecondsPerSecond) /
|
| ticks_per_second_);
|
| @@ -447,7 +450,8 @@ NowFunction now_function = RolloverProtectedNow;
|
|
|
| bool CPUReliablySupportsHighResTime() {
|
| base::CPU cpu;
|
| - if (!cpu.has_non_stop_time_stamp_counter())
|
| + if (!cpu.has_non_stop_time_stamp_counter() ||
|
| + !GetHighResNowSingleton()->IsUsingHighResClock())
|
| return false;
|
|
|
| if (IsBuggyAthlon(cpu))
|
|
|