| // Copyright 2017 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "starboard/time.h" |
| |
| #include <windows.h> |
| |
| #include "starboard/common/log.h" |
| |
| SbTimeMonotonic SbTimeGetMonotonicNow() { |
| LARGE_INTEGER counts; |
| bool success; |
| |
| success = QueryPerformanceCounter(&counts); |
| |
| // "On systems that run Windows XP or later, |
| // the function will always succeed and will thus never return zero." |
| // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx |
| SB_DCHECK(success); |
| |
| LARGE_INTEGER countsPerSecond; |
| success = QueryPerformanceFrequency(&countsPerSecond); |
| // "On systems that run Windows XP or later, |
| // the function will always succeed and will thus never return zero." |
| // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644905(v=vs.85).aspx |
| SB_DCHECK(success); |
| |
| // An observed value of countsPerSecond on a desktop x86 machine is |
| // ~2.5e6. With this frequency, it will take ~37500 days to exceed |
| // 2^53, which is the mantissa precision of a double. |
| // Hence, we can safely convert to a double here without losing precision. |
| double result = static_cast<double>(counts.QuadPart); |
| result *= (1000.0 * 1000.0) / countsPerSecond.QuadPart; |
| |
| return static_cast<SbTimeMonotonic>(result); |
| } |