| Index: base/time/time_win.cc
|
| diff --git a/base/time/time_win.cc b/base/time/time_win.cc
|
| index 492b54a93f126717ad0b2c339e75322bdeeb1532..9cd86111e78de81ae8195d797d7870d306429ae9 100644
|
| --- a/base/time/time_win.cc
|
| +++ b/base/time/time_win.cc
|
| @@ -373,21 +373,24 @@ bool IsBuggyAthlon(const base::CPU& cpu) {
|
| class HighResNowSingleton {
|
| public:
|
| HighResNowSingleton()
|
| - : ticks_per_second_(0),
|
| - skew_(0) {
|
| - InitializeClock();
|
| + : ticks_per_second_(0),
|
| + skew_(0) {
|
|
|
| base::CPU cpu;
|
| if (IsBuggyAthlon(cpu))
|
| - DisableHighResClock();
|
| - }
|
| + return;
|
|
|
| - bool IsUsingHighResClock() {
|
| - return ticks_per_second_ != 0.0;
|
| + // Synchronize the QPC clock with GetSystemTimeAsFileTime.
|
| + LARGE_INTEGER ticks_per_sec = {0};
|
| + if (!QueryPerformanceFrequency(&ticks_per_sec))
|
| + return; // QPC is not available.
|
| + ticks_per_second_ = ticks_per_sec.QuadPart;
|
| +
|
| + skew_ = UnreliableNow() - ReliableNow();
|
| }
|
|
|
| - void DisableHighResClock() {
|
| - ticks_per_second_ = 0.0;
|
| + bool IsUsingHighResClock() {
|
| + return ticks_per_second_ != 0;
|
| }
|
|
|
| TimeDelta Now() {
|
| @@ -422,16 +425,6 @@ class HighResNowSingleton {
|
| }
|
|
|
| private:
|
| - // Synchronize the QPC clock with GetSystemTimeAsFileTime.
|
| - void InitializeClock() {
|
| - LARGE_INTEGER ticks_per_sec = {0};
|
| - if (!QueryPerformanceFrequency(&ticks_per_sec))
|
| - return; // Broken, we don't guarantee this function works.
|
| - ticks_per_second_ = ticks_per_sec.QuadPart;
|
| -
|
| - skew_ = UnreliableNow() - ReliableNow();
|
| - }
|
| -
|
| // Get the number of microseconds since boot in an unreliable fashion.
|
| int64 UnreliableNow() {
|
| LARGE_INTEGER now;
|
| @@ -460,7 +453,6 @@ TimeDelta HighResNowWrapper() {
|
| }
|
|
|
| typedef TimeDelta (*NowFunction)(void);
|
| -NowFunction now_function = RolloverProtectedNow;
|
|
|
| bool CPUReliablySupportsHighResTime() {
|
| base::CPU cpu;
|
| @@ -474,6 +466,23 @@ bool CPUReliablySupportsHighResTime() {
|
| return true;
|
| }
|
|
|
| +TimeDelta InitialNowFunction();
|
| +
|
| +NowFunction now_function = InitialNowFunction;
|
| +
|
| +TimeDelta InitialNowFunction() {
|
| + if (!CPUReliablySupportsHighResTime()) {
|
| + InterlockedExchangePointer(
|
| + reinterpret_cast<volatile PVOID*>(&now_function),
|
| + reinterpret_cast<PVOID>(RolloverProtectedNow));
|
| + return RolloverProtectedNow();
|
| + }
|
| + InterlockedExchangePointer(
|
| + reinterpret_cast<volatile PVOID*>(&now_function),
|
| + reinterpret_cast<PVOID>(HighResNowWrapper));
|
| + return HighResNowWrapper();
|
| +}
|
| +
|
| } // namespace
|
|
|
| // static
|
| @@ -488,16 +497,6 @@ TimeTicks::TickFunctionType TimeTicks::SetMockTickFunction(
|
| }
|
|
|
| // static
|
| -bool TimeTicks::SetNowIsHighResNowIfSupported() {
|
| - if (!CPUReliablySupportsHighResTime()) {
|
| - return false;
|
| - }
|
| -
|
| - now_function = HighResNowWrapper;
|
| - return true;
|
| -}
|
| -
|
| -// static
|
| TimeTicks TimeTicks::Now() {
|
| return TimeTicks() + now_function();
|
| }
|
|
|