Chromium Code Reviews| 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)); |
|
M-A Ruel
2014/09/03 01:26:12
s/PVOID/void*/g
fmeawad
2014/09/03 18:56:33
Done.
|
| + 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(); |
| } |