diff options
Diffstat (limited to 'src/corelib/tools/qelapsedtimer_win.cpp')
-rw-r--r-- | src/corelib/tools/qelapsedtimer_win.cpp | 49 |
1 files changed, 10 insertions, 39 deletions
diff --git a/src/corelib/tools/qelapsedtimer_win.cpp b/src/corelib/tools/qelapsedtimer_win.cpp index 532d61d504..520126d262 100644 --- a/src/corelib/tools/qelapsedtimer_win.cpp +++ b/src/corelib/tools/qelapsedtimer_win.cpp @@ -40,35 +40,21 @@ #include "qelapsedtimer.h" #include <qt_windows.h> -typedef ULONGLONG (WINAPI *PtrGetTickCount64)(void); -#if defined(Q_OS_WINRT) - static const PtrGetTickCount64 ptrGetTickCount64 = &GetTickCount64; -#else - static PtrGetTickCount64 ptrGetTickCount64 = 0; -#endif - QT_BEGIN_NAMESPACE // Result of QueryPerformanceFrequency, 0 indicates that the high resolution timer is unavailable static quint64 counterFrequency = 0; -static void resolveLibs() +static void resolveCounterFrequency() { static bool done = false; if (done) return; -#if !defined(Q_OS_WINRT) - // try to get GetTickCount64 from the system - HMODULE kernel32 = GetModuleHandleW(L"kernel32"); - if (!kernel32) - return; - ptrGetTickCount64 = (PtrGetTickCount64)GetProcAddress(kernel32, "GetTickCount64"); -#endif // !Q_OS_WINRT - // Retrieve the number of high-resolution performance counter ticks per second LARGE_INTEGER frequency; if (!QueryPerformanceFrequency(&frequency)) { + qFatal("QueryPerformanceFrequency failed, even though Microsoft documentation promises it wouldn't."); counterFrequency = 0; } else { counterFrequency = frequency.QuadPart; @@ -92,35 +78,20 @@ static inline qint64 ticksToNanoseconds(qint64 ticks) static quint64 getTickCount() { - resolveLibs(); + resolveCounterFrequency(); // This avoids a division by zero and disables the high performance counter if it's not available if (counterFrequency > 0) { LARGE_INTEGER counter; - if (QueryPerformanceCounter(&counter)) { - return counter.QuadPart; - } else { - qWarning("QueryPerformanceCounter failed, although QueryPerformanceFrequency succeeded."); - return 0; - } + bool ok = QueryPerformanceCounter(&counter); + Q_ASSERT_X(ok, "QElapsedTimer::start()", + "QueryPerformanceCounter failed, although QueryPerformanceFrequency succeeded."); + Q_UNUSED(ok); + return counter.QuadPart; } -#ifndef Q_OS_WINRT - if (ptrGetTickCount64) - return ptrGetTickCount64(); - - static quint32 highdword = 0; - static quint32 lastval = 0; - quint32 val = GetTickCount(); - if (val < lastval) - ++highdword; - lastval = val; - return val | (quint64(highdword) << 32); -#else // !Q_OS_WINRT - // ptrGetTickCount64 is always set on WinRT but GetTickCount is not available - return ptrGetTickCount64(); -#endif // Q_OS_WINRT + return GetTickCount64(); } quint64 qt_msectime() @@ -130,7 +101,7 @@ quint64 qt_msectime() QElapsedTimer::ClockType QElapsedTimer::clockType() Q_DECL_NOTHROW { - resolveLibs(); + resolveCounterFrequency(); if (counterFrequency > 0) return PerformanceCounter; |