OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 | 5 |
6 // Windows Timer Primer | 6 // Windows Timer Primer |
7 // | 7 // |
8 // A good article: http://www.ddj.com/windows/184416651 | 8 // A good article: http://www.ddj.com/windows/184416651 |
9 // A good mozilla bug: http://bugzilla.mozilla.org/show_bug.cgi?id=363258 | 9 // A good mozilla bug: http://bugzilla.mozilla.org/show_bug.cgi?id=363258 |
10 // | 10 // |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 // Returns the current value of the performance counter. | 103 // Returns the current value of the performance counter. |
104 uint64_t QPCNowRaw() { | 104 uint64_t QPCNowRaw() { |
105 LARGE_INTEGER perf_counter_now = {}; | 105 LARGE_INTEGER perf_counter_now = {}; |
106 // According to the MSDN documentation for QueryPerformanceCounter(), this | 106 // According to the MSDN documentation for QueryPerformanceCounter(), this |
107 // will never fail on systems that run XP or later. | 107 // will never fail on systems that run XP or later. |
108 // https://msdn.microsoft.com/library/windows/desktop/ms644904.aspx | 108 // https://msdn.microsoft.com/library/windows/desktop/ms644904.aspx |
109 ::QueryPerformanceCounter(&perf_counter_now); | 109 ::QueryPerformanceCounter(&perf_counter_now); |
110 return perf_counter_now.QuadPart; | 110 return perf_counter_now.QuadPart; |
111 } | 111 } |
112 | 112 |
| 113 bool SafeConvertToWord(int in, WORD* out) { |
| 114 base::CheckedNumeric<WORD> result = in; |
| 115 *out = result.ValueOrDefault(std::numeric_limits<WORD>::max()); |
| 116 return result.IsValid(); |
| 117 } |
| 118 |
113 } // namespace | 119 } // namespace |
114 | 120 |
115 // Time ----------------------------------------------------------------------- | 121 // Time ----------------------------------------------------------------------- |
116 | 122 |
117 // The internal representation of Time uses FILETIME, whose epoch is 1601-01-01 | 123 // The internal representation of Time uses FILETIME, whose epoch is 1601-01-01 |
118 // 00:00:00 UTC. ((1970-1601)*365+89)*24*60*60*1000*1000, where 89 is the | 124 // 00:00:00 UTC. ((1970-1601)*365+89)*24*60*60*1000*1000, where 89 is the |
119 // number of leap year days between 1601 and 1970: (1970-1601)/4 excluding | 125 // number of leap year days between 1601 and 1970: (1970-1601)/4 excluding |
120 // 1700, 1800, and 1900. | 126 // 1700, 1800, and 1900. |
121 // static | 127 // static |
122 const int64_t Time::kTimeTToMicrosecondsOffset = INT64_C(11644473600000000); | 128 const int64_t Time::kTimeTToMicrosecondsOffset = INT64_C(11644473600000000); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 | 237 |
232 // static | 238 // static |
233 bool Time::IsHighResolutionTimerInUse() { | 239 bool Time::IsHighResolutionTimerInUse() { |
234 base::AutoLock lock(g_high_res_lock.Get()); | 240 base::AutoLock lock(g_high_res_lock.Get()); |
235 return g_high_res_timer_enabled && g_high_res_timer_count > 0; | 241 return g_high_res_timer_enabled && g_high_res_timer_count > 0; |
236 } | 242 } |
237 | 243 |
238 // static | 244 // static |
239 bool Time::FromExploded(bool is_local, const Exploded& exploded, Time* time) { | 245 bool Time::FromExploded(bool is_local, const Exploded& exploded, Time* time) { |
240 // Create the system struct representing our exploded time. It will either be | 246 // Create the system struct representing our exploded time. It will either be |
241 // in local time or UTC. | 247 // in local time or UTC.If casting from int to WORD results in overflow, |
| 248 // fail and return Time(0). |
242 SYSTEMTIME st; | 249 SYSTEMTIME st; |
243 st.wYear = static_cast<WORD>(exploded.year); | 250 if (!SafeConvertToWord(exploded.year, &st.wYear) || |
244 st.wMonth = static_cast<WORD>(exploded.month); | 251 !SafeConvertToWord(exploded.month, &st.wMonth) || |
245 st.wDayOfWeek = static_cast<WORD>(exploded.day_of_week); | 252 !SafeConvertToWord(exploded.day_of_week, &st.wDayOfWeek) || |
246 st.wDay = static_cast<WORD>(exploded.day_of_month); | 253 !SafeConvertToWord(exploded.day_of_month, &st.wDay) || |
247 st.wHour = static_cast<WORD>(exploded.hour); | 254 !SafeConvertToWord(exploded.hour, &st.wHour) || |
248 st.wMinute = static_cast<WORD>(exploded.minute); | 255 !SafeConvertToWord(exploded.minute, &st.wMinute) || |
249 st.wSecond = static_cast<WORD>(exploded.second); | 256 !SafeConvertToWord(exploded.second, &st.wSecond) || |
250 st.wMilliseconds = static_cast<WORD>(exploded.millisecond); | 257 !SafeConvertToWord(exploded.millisecond, &st.wMilliseconds)) { |
| 258 *time = base::Time(0); |
| 259 return false; |
| 260 } |
251 | 261 |
252 FILETIME ft; | 262 FILETIME ft; |
253 bool success = true; | 263 bool success = true; |
254 // Ensure that it's in UTC. | 264 // Ensure that it's in UTC. |
255 if (is_local) { | 265 if (is_local) { |
256 SYSTEMTIME utc_st; | 266 SYSTEMTIME utc_st; |
257 success = TzSpecificLocalTimeToSystemTime(nullptr, &st, &utc_st) && | 267 success = TzSpecificLocalTimeToSystemTime(nullptr, &st, &utc_st) && |
258 SystemTimeToFileTime(&utc_st, &ft); | 268 SystemTimeToFileTime(&utc_st, &ft); |
259 } else { | 269 } else { |
260 success = !!SystemTimeToFileTime(&st, &ft); | 270 success = !!SystemTimeToFileTime(&st, &ft); |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 TimeTicks TimeTicks::FromQPCValue(LONGLONG qpc_value) { | 674 TimeTicks TimeTicks::FromQPCValue(LONGLONG qpc_value) { |
665 return TimeTicks() + QPCValueToTimeDelta(qpc_value); | 675 return TimeTicks() + QPCValueToTimeDelta(qpc_value); |
666 } | 676 } |
667 | 677 |
668 // TimeDelta ------------------------------------------------------------------ | 678 // TimeDelta ------------------------------------------------------------------ |
669 | 679 |
670 // static | 680 // static |
671 TimeDelta TimeDelta::FromQPCValue(LONGLONG qpc_value) { | 681 TimeDelta TimeDelta::FromQPCValue(LONGLONG qpc_value) { |
672 return QPCValueToTimeDelta(qpc_value); | 682 return QPCValueToTimeDelta(qpc_value); |
673 } | 683 } |
OLD | NEW |