QElapsedTimer/Win: Fix 64-bit integer overflow
authorJonathan Liu <net147@gmail.com>
Tue, 21 Feb 2012 04:54:25 +0000 (15:54 +1100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 21 Feb 2012 23:07:31 +0000 (00:07 +0100)
The ticksToNanoseconds function in qelapsedtimer_win.cpp multiplies
ticks from performance counter with 1000000000 which can sometimes
result in 64-bit integer overflow. This can cause the elapsed time to
reset or jump around.

Task-number: QTBUG-23150
Change-Id: I464503e03cbe64e13906e773beafbf88e7dc256a
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit f30a91ba9d98de1a0ebee5608ba289ac35871a8c)

src/corelib/tools/qelapsedtimer_win.cpp

index b1faf22..8171a27 100644 (file)
@@ -83,7 +83,9 @@ static inline qint64 ticksToNanoseconds(qint64 ticks)
 {
     if (counterFrequency > 0) {
         // QueryPerformanceCounter uses an arbitrary frequency
-        return ticks * 1000000000 / counterFrequency;
+        qint64 seconds = ticks / counterFrequency;
+        qint64 nanoSeconds = (ticks - seconds * counterFrequency) * 1000000000 / counterFrequency;
+        return seconds * 1000000000 + nanoSeconds;
     } else {
         // GetTickCount(64) return milliseconds
         return ticks * 1000000;