Index: base/time/time_win.cc |
diff --git a/base/time/time_win.cc b/base/time/time_win.cc |
index cf7be687d2e5a0b292414796f1b3c25e2535f518..330ee3d68401d2abf42cb283596a0102a0b88cb1 100644 |
--- a/base/time/time_win.cc |
+++ b/base/time/time_win.cc |
@@ -391,17 +391,21 @@ class HighResNowSingleton { |
} |
int64 QPCValueToMicroseconds(LONGLONG qpc_value) { |
- if (!ticks_per_second_) |
brianderson
2014/07/29 23:53:29
I remember you had an explanation for why this cou
fmeawad
2014/07/30 00:49:49
I added that check in the CPUReliablySupportsHighR
brianderson
2014/07/30 00:58:19
Thanks for the explanation.
I was thinking about
|
- return 0; |
- |
- // Intentionally calculate microseconds in a round about manner to avoid |
- // overflow and precision issues. Think twice before simplifying! |
- int64 whole_seconds = qpc_value / ticks_per_second_; |
- int64 leftover_ticks = qpc_value % ticks_per_second_; |
- int64 microseconds = (whole_seconds * Time::kMicrosecondsPerSecond) + |
- ((leftover_ticks * Time::kMicrosecondsPerSecond) / |
- ticks_per_second_); |
- return microseconds; |
+ // Time::kMicrosecondsPerSecond has 20 bits, to avoid overflow we do a |
+ // simple multiplication then division if the qpc_value has less than 44 |
+ // bits. |
+ if (qpc_value & 0xFFFFF00000000000) |
jar (doing other things)
2014/07/30 23:43:09
Please unit test at exactly above and below this b
jar (doing other things)
2014/07/31 00:01:43
I think the largest positive 64 bit number is 2^63
fmeawad
2014/07/31 18:54:21
Done.
fmeawad
2014/07/31 18:54:21
Done.
|
+ { |
+ // Intentionally calculate microseconds in a round about manner to avoid |
+ // overflow and precision issues. Think twice before simplifying! |
+ int64 whole_seconds = qpc_value / ticks_per_second_; |
+ int64 leftover_ticks = qpc_value % ticks_per_second_; |
+ int64 microseconds = (whole_seconds * Time::kMicrosecondsPerSecond) + |
+ ((leftover_ticks * Time::kMicrosecondsPerSecond) / |
+ ticks_per_second_); |
+ return microseconds; |
+ } |
+ return qpc_value * Time::kMicrosecondsPerSecond / ticks_per_second_; |
brianderson
2014/07/29 23:53:29
Would a single double-precision multiplication be
fmeawad
2014/07/30 00:49:49
I made a quick experiment, and I have found no win
brianderson
2014/07/30 00:58:19
Thanks for testing that.
|
} |
private: |
@@ -447,7 +451,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)) |