| Line | Source Code | Coverage |
|---|
| 1 | /**************************************************************************** | - |
| 2 | ** | - |
| 3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
| 4 | ** Contact: http://www.qt-project.org/legal | - |
| 5 | ** | - |
| 6 | ** This file is part of the QtCore module of the Qt Toolkit. | - |
| 7 | ** | - |
| 8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
| 9 | ** Commercial License Usage | - |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
| 11 | ** accordance with the commercial license agreement provided with the | - |
| 12 | ** Software or, alternatively, in accordance with the terms contained in | - |
| 13 | ** a written agreement between you and Digia. For licensing terms and | - |
| 14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
| 15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
| 16 | ** | - |
| 17 | ** GNU Lesser General Public License Usage | - |
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
| 19 | ** General Public License version 2.1 as published by the Free Software | - |
| 20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
| 21 | ** packaging of this file. Please review the following information to | - |
| 22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
| 23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
| 24 | ** | - |
| 25 | ** In addition, as a special exception, Digia gives you certain additional | - |
| 26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
| 27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
| 28 | ** | - |
| 29 | ** GNU General Public License Usage | - |
| 30 | ** Alternatively, this file may be used under the terms of the GNU | - |
| 31 | ** General Public License version 3.0 as published by the Free Software | - |
| 32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
| 33 | ** packaging of this file. Please review the following information to | - |
| 34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
| 35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
| 36 | ** | - |
| 37 | ** | - |
| 38 | ** $QT_END_LICENSE$ | - |
| 39 | ** | - |
| 40 | ****************************************************************************/ | - |
| 41 | | - |
| 42 | #include <qelapsedtimer.h> | - |
| 43 | #include <qcoreapplication.h> | - |
| 44 | | - |
| 45 | #include "private/qcore_unix_p.h" | - |
| 46 | #include "private/qtimerinfo_unix_p.h" | - |
| 47 | #include "private/qobject_p.h" | - |
| 48 | #include "private/qabstracteventdispatcher_p.h" | - |
| 49 | | - |
| 50 | #ifdef QTIMERINFO_DEBUG | - |
| 51 | # include <QDebug> | - |
| 52 | # include <QThread> | - |
| 53 | #endif | - |
| 54 | | - |
| 55 | #include <sys/times.h> | - |
| 56 | | - |
| 57 | QT_BEGIN_NAMESPACE | - |
| 58 | | - |
| 59 | Q_CORE_EXPORT bool qt_disable_lowpriority_timers=false; | - |
| 60 | | - |
| 61 | /* | - |
| 62 | * Internal functions for manipulating timer data structures. The | - |
| 63 | * timerBitVec array is used for keeping track of timer identifiers. | - |
| 64 | */ | - |
| 65 | | - |
| 66 | QTimerInfoList::QTimerInfoList() | - |
| 67 | { | - |
| 68 | #if (_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(Q_OS_MAC) && !defined(Q_OS_NACL) | - |
| 69 | if (!QElapsedTimer::isMonotonic()) { partially evaluated: !QElapsedTimer::isMonotonic()| no Evaluation Count:0 | yes Evaluation Count:1717532 |
| 0-1717532 |
| 70 | // not using monotonic timers, initialize the timeChanged() machinery | - |
| 71 | previousTime = qt_gettime(); never executed (the execution status of this line is deduced): previousTime = qt_gettime(); | - |
| 72 | | - |
| 73 | tms unused; never executed (the execution status of this line is deduced): tms unused; | - |
| 74 | previousTicks = times(&unused); never executed (the execution status of this line is deduced): previousTicks = times(&unused); | - |
| 75 | | - |
| 76 | ticksPerSecond = sysconf(_SC_CLK_TCK); never executed (the execution status of this line is deduced): ticksPerSecond = sysconf(_SC_CLK_TCK); | - |
| 77 | msPerTick = 1000/ticksPerSecond; never executed (the execution status of this line is deduced): msPerTick = 1000/ticksPerSecond; | - |
| 78 | } else { | 0 |
| 79 | // detected monotonic timers | - |
| 80 | previousTime.tv_sec = previousTime.tv_usec = 0; executed (the execution status of this line is deduced): previousTime.tv_sec = previousTime.tv_usec = 0; | - |
| 81 | previousTicks = 0; executed (the execution status of this line is deduced): previousTicks = 0; | - |
| 82 | ticksPerSecond = 0; executed (the execution status of this line is deduced): ticksPerSecond = 0; | - |
| 83 | msPerTick = 0; executed (the execution status of this line is deduced): msPerTick = 0; | - |
| 84 | } executed: }Execution Count:1717531 | 1717531 |
| 85 | #endif | - |
| 86 | | - |
| 87 | firstTimerInfo = 0; executed (the execution status of this line is deduced): firstTimerInfo = 0; | - |
| 88 | } executed: }Execution Count:1717531 | 1717531 |
| 89 | | - |
| 90 | timeval QTimerInfoList::updateCurrentTime() | - |
| 91 | { | - |
| 92 | return (currentTime = qt_gettime()); executed: return (currentTime = qt_gettime());Execution Count:1062167 | 1062167 |
| 93 | } | - |
| 94 | | - |
| 95 | #if ((_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(Q_OS_MAC) && !defined(Q_OS_INTEGRITY)) || defined(QT_BOOTSTRAPPED) | - |
| 96 | | - |
| 97 | template <> | - |
| 98 | timeval qAbs(const timeval &t) | - |
| 99 | { | - |
| 100 | timeval tmp = t; never executed (the execution status of this line is deduced): timeval tmp = t; | - |
| 101 | if (tmp.tv_sec < 0) { never evaluated: tmp.tv_sec < 0 | 0 |
| 102 | tmp.tv_sec = -tmp.tv_sec - 1; never executed (the execution status of this line is deduced): tmp.tv_sec = -tmp.tv_sec - 1; | - |
| 103 | tmp.tv_usec -= 1000000; never executed (the execution status of this line is deduced): tmp.tv_usec -= 1000000; | - |
| 104 | } | 0 |
| 105 | if (tmp.tv_sec == 0 && tmp.tv_usec < 0) { never evaluated: tmp.tv_sec == 0 never evaluated: tmp.tv_usec < 0 | 0 |
| 106 | tmp.tv_usec = -tmp.tv_usec; never executed (the execution status of this line is deduced): tmp.tv_usec = -tmp.tv_usec; | - |
| 107 | } | 0 |
| 108 | return normalizedTimeval(tmp); never executed: return normalizedTimeval(tmp); | 0 |
| 109 | } | - |
| 110 | | - |
| 111 | /* | - |
| 112 | Returns true if the real time clock has changed by more than 10% | - |
| 113 | relative to the processor time since the last time this function was | - |
| 114 | called. This presumably means that the system time has been changed. | - |
| 115 | | - |
| 116 | If /a delta is nonzero, delta is set to our best guess at how much the system clock was changed. | - |
| 117 | */ | - |
| 118 | bool QTimerInfoList::timeChanged(timeval *delta) | - |
| 119 | { | - |
| 120 | #ifdef Q_OS_NACL | - |
| 121 | Q_UNUSED(delta) | - |
| 122 | return false; // Calling "times" crashes. | - |
| 123 | #endif | - |
| 124 | struct tms unused; never executed (the execution status of this line is deduced): struct tms unused; | - |
| 125 | clock_t currentTicks = times(&unused); never executed (the execution status of this line is deduced): clock_t currentTicks = times(&unused); | - |
| 126 | | - |
| 127 | clock_t elapsedTicks = currentTicks - previousTicks; never executed (the execution status of this line is deduced): clock_t elapsedTicks = currentTicks - previousTicks; | - |
| 128 | timeval elapsedTime = currentTime - previousTime; never executed (the execution status of this line is deduced): timeval elapsedTime = currentTime - previousTime; | - |
| 129 | | - |
| 130 | timeval elapsedTimeTicks; never executed (the execution status of this line is deduced): timeval elapsedTimeTicks; | - |
| 131 | elapsedTimeTicks.tv_sec = elapsedTicks / ticksPerSecond; never executed (the execution status of this line is deduced): elapsedTimeTicks.tv_sec = elapsedTicks / ticksPerSecond; | - |
| 132 | elapsedTimeTicks.tv_usec = (((elapsedTicks * 1000) / ticksPerSecond) % 1000) * 1000; never executed (the execution status of this line is deduced): elapsedTimeTicks.tv_usec = (((elapsedTicks * 1000) / ticksPerSecond) % 1000) * 1000; | - |
| 133 | | - |
| 134 | timeval dummy; never executed (the execution status of this line is deduced): timeval dummy; | - |
| 135 | if (!delta) | 0 |
| 136 | delta = &dummy; never executed: delta = &dummy; | 0 |
| 137 | *delta = elapsedTime - elapsedTimeTicks; never executed (the execution status of this line is deduced): *delta = elapsedTime - elapsedTimeTicks; | - |
| 138 | | - |
| 139 | previousTicks = currentTicks; never executed (the execution status of this line is deduced): previousTicks = currentTicks; | - |
| 140 | previousTime = currentTime; never executed (the execution status of this line is deduced): previousTime = currentTime; | - |
| 141 | | - |
| 142 | // If tick drift is more than 10% off compared to realtime, we assume that the clock has | - |
| 143 | // been set. Of course, we have to allow for the tick granularity as well. | - |
| 144 | timeval tickGranularity; never executed (the execution status of this line is deduced): timeval tickGranularity; | - |
| 145 | tickGranularity.tv_sec = 0; never executed (the execution status of this line is deduced): tickGranularity.tv_sec = 0; | - |
| 146 | tickGranularity.tv_usec = msPerTick * 1000; never executed (the execution status of this line is deduced): tickGranularity.tv_usec = msPerTick * 1000; | - |
| 147 | return elapsedTimeTicks < ((qAbs(*delta) - tickGranularity) * 10); never executed: return elapsedTimeTicks < ((qAbs(*delta) - tickGranularity) * 10); | 0 |
| 148 | } | - |
| 149 | | - |
| 150 | /* | - |
| 151 | repair broken timer | - |
| 152 | */ | - |
| 153 | void QTimerInfoList::timerRepair(const timeval &diff) | - |
| 154 | { | - |
| 155 | // repair all timers | - |
| 156 | for (int i = 0; i < size(); ++i) { never evaluated: i < size() | 0 |
| 157 | register QTimerInfo *t = at(i); never executed (the execution status of this line is deduced): register QTimerInfo *t = at(i); | - |
| 158 | t->timeout = t->timeout + diff; never executed (the execution status of this line is deduced): t->timeout = t->timeout + diff; | - |
| 159 | } | 0 |
| 160 | } | 0 |
| 161 | | - |
| 162 | void QTimerInfoList::repairTimersIfNeeded() | - |
| 163 | { | - |
| 164 | if (QElapsedTimer::isMonotonic()) partially evaluated: QElapsedTimer::isMonotonic()| yes Evaluation Count:667496 | no Evaluation Count:0 |
| 0-667496 |
| 165 | return; executed: return;Execution Count:667493 | 667493 |
| 166 | timeval delta; never executed (the execution status of this line is deduced): timeval delta; | - |
| 167 | if (timeChanged(&delta)) never evaluated: timeChanged(&delta) | 0 |
| 168 | timerRepair(delta); never executed: timerRepair(delta); | 0 |
| 169 | } | 0 |
| 170 | | - |
| 171 | #else // !(_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(QT_BOOTSTRAPPED) | - |
| 172 | | - |
| 173 | void QTimerInfoList::repairTimersIfNeeded() | - |
| 174 | { | - |
| 175 | } | - |
| 176 | | - |
| 177 | #endif | - |
| 178 | | - |
| 179 | /* | - |
| 180 | insert timer info into list | - |
| 181 | */ | - |
| 182 | void QTimerInfoList::timerInsert(QTimerInfo *ti) | - |
| 183 | { | - |
| 184 | int index = size(); executed (the execution status of this line is deduced): int index = size(); | - |
| 185 | while (index--) { evaluated: index--| yes Evaluation Count:319711 | yes Evaluation Count:63534 |
| 63534-319711 |
| 186 | register const QTimerInfo * const t = at(index); executed (the execution status of this line is deduced): register const QTimerInfo * const t = at(index); | - |
| 187 | if (!(ti->timeout < t->timeout)) evaluated: !(ti->timeout < t->timeout)| yes Evaluation Count:111022 | yes Evaluation Count:208689 |
| 111022-208689 |
| 188 | break; executed: break;Execution Count:111022 | 111022 |
| 189 | } executed: }Execution Count:208689 | 208689 |
| 190 | insert(index+1, ti); executed (the execution status of this line is deduced): insert(index+1, ti); | - |
| 191 | } executed: }Execution Count:174556 | 174556 |
| 192 | | - |
| 193 | inline timeval &operator+=(timeval &t1, int ms) | - |
| 194 | { | - |
| 195 | t1.tv_sec += ms / 1000; executed (the execution status of this line is deduced): t1.tv_sec += ms / 1000; | - |
| 196 | t1.tv_usec += ms % 1000 * 1000; executed (the execution status of this line is deduced): t1.tv_usec += ms % 1000 * 1000; | - |
| 197 | return normalizedTimeval(t1); executed: return normalizedTimeval(t1);Execution Count:211189 | 211189 |
| 198 | } | - |
| 199 | | - |
| 200 | inline timeval operator+(const timeval &t1, int ms) | - |
| 201 | { | - |
| 202 | timeval t2 = t1; executed (the execution status of this line is deduced): timeval t2 = t1; | - |
| 203 | return t2 += ms; executed: return t2 += ms;Execution Count:132417 | 132417 |
| 204 | } | - |
| 205 | | - |
| 206 | static timeval roundToMillisecond(timeval val) | - |
| 207 | { | - |
| 208 | // always round up | - |
| 209 | // worst case scenario is that the first trigger of a 1-ms timer is 0.999 ms late | - |
| 210 | | - |
| 211 | int us = val.tv_usec % 1000; executed (the execution status of this line is deduced): int us = val.tv_usec % 1000; | - |
| 212 | val.tv_usec += 1000 - us; executed (the execution status of this line is deduced): val.tv_usec += 1000 - us; | - |
| 213 | return normalizedTimeval(val); executed: return normalizedTimeval(val);Execution Count:263163 | 263163 |
| 214 | } | - |
| 215 | | - |
| 216 | #ifdef QTIMERINFO_DEBUG | - |
| 217 | QDebug operator<<(QDebug s, timeval tv) | - |
| 218 | { | - |
| 219 | s.nospace() << tv.tv_sec << "." << qSetFieldWidth(6) << qSetPadChar(QChar(48)) << tv.tv_usec << reset; | - |
| 220 | return s.space(); | - |
| 221 | } | - |
| 222 | QDebug operator<<(QDebug s, Qt::TimerType t) | - |
| 223 | { | - |
| 224 | s << (t == Qt::PreciseTimer ? "P" : | - |
| 225 | t == Qt::CoarseTimer ? "C" : "VC"); | - |
| 226 | return s; | - |
| 227 | } | - |
| 228 | #endif | - |
| 229 | | - |
| 230 | static void calculateCoarseTimerTimeout(QTimerInfo *t, timeval currentTime) | - |
| 231 | { | - |
| 232 | // The coarse timer works like this: | - |
| 233 | // - interval under 40 ms: round to even | - |
| 234 | // - between 40 and 99 ms: round to multiple of 4 | - |
| 235 | // - otherwise: try to wake up at a multiple of 25 ms, with a maximum error of 5% | - |
| 236 | // | - |
| 237 | // We try to wake up at the following second-fraction, in order of preference: | - |
| 238 | // 0 ms | - |
| 239 | // 500 ms | - |
| 240 | // 250 ms or 750 ms | - |
| 241 | // 200, 400, 600, 800 ms | - |
| 242 | // other multiples of 100 | - |
| 243 | // other multiples of 50 | - |
| 244 | // other multiples of 25 | - |
| 245 | // | - |
| 246 | // The objective is to make most timers wake up at the same time, thereby reducing CPU wakeups. | - |
| 247 | | - |
| 248 | register uint interval = uint(t->interval); executed (the execution status of this line is deduced): register uint interval = uint(t->interval); | - |
| 249 | register uint msec = uint(t->timeout.tv_usec) / 1000; executed (the execution status of this line is deduced): register uint msec = uint(t->timeout.tv_usec) / 1000; | - |
| 250 | Q_ASSERT(interval >= 20); executed (the execution status of this line is deduced): qt_noop(); | - |
| 251 | | - |
| 252 | // Calculate how much we can round and still keep within 5% error | - |
| 253 | uint absMaxRounding = interval / 20; executed (the execution status of this line is deduced): uint absMaxRounding = interval / 20; | - |
| 254 | | - |
| 255 | if (interval < 100 && interval != 25 && interval != 50 && interval != 75) { evaluated: interval < 100| yes Evaluation Count:1353 | yes Evaluation Count:8100 |
partially evaluated: interval != 25| yes Evaluation Count:1353 | no Evaluation Count:0 |
evaluated: interval != 50| yes Evaluation Count:1346 | yes Evaluation Count:7 |
partially evaluated: interval != 75| yes Evaluation Count:1346 | no Evaluation Count:0 |
| 0-8100 |
| 256 | // special mode for timers of less than 100 ms | - |
| 257 | if (interval < 50) { evaluated: interval < 50| yes Evaluation Count:1329 | yes Evaluation Count:17 |
| 17-1329 |
| 258 | // round to even | - |
| 259 | // round towards multiples of 50 ms | - |
| 260 | register bool roundUp = (msec % 50) >= 25; executed (the execution status of this line is deduced): register bool roundUp = (msec % 50) >= 25; | - |
| 261 | msec >>= 1; executed (the execution status of this line is deduced): msec >>= 1; | - |
| 262 | msec |= uint(roundUp); executed (the execution status of this line is deduced): msec |= uint(roundUp); | - |
| 263 | msec <<= 1; executed (the execution status of this line is deduced): msec <<= 1; | - |
| 264 | } else { executed: }Execution Count:1329 | 1329 |
| 265 | // round to multiple of 4 | - |
| 266 | // round towards multiples of 100 ms | - |
| 267 | register bool roundUp = (msec % 100) >= 50; executed (the execution status of this line is deduced): register bool roundUp = (msec % 100) >= 50; | - |
| 268 | msec >>= 2; executed (the execution status of this line is deduced): msec >>= 2; | - |
| 269 | msec |= uint(roundUp); executed (the execution status of this line is deduced): msec |= uint(roundUp); | - |
| 270 | msec <<= 2; executed (the execution status of this line is deduced): msec <<= 2; | - |
| 271 | } executed: }Execution Count:17 | 17 |
| 272 | } else { | - |
| 273 | uint min = qMax<int>(0, msec - absMaxRounding); executed (the execution status of this line is deduced): uint min = qMax<int>(0, msec - absMaxRounding); | - |
| 274 | uint max = qMin(1000u, msec + absMaxRounding); executed (the execution status of this line is deduced): uint max = qMin(1000u, msec + absMaxRounding); | - |
| 275 | | - |
| 276 | // find the boundary that we want, according to the rules above | - |
| 277 | // extra rules: | - |
| 278 | // 1) whatever the interval, we'll take any round-to-the-second timeout | - |
| 279 | if (min == 0) { evaluated: min == 0| yes Evaluation Count:1238 | yes Evaluation Count:6869 |
| 1238-6869 |
| 280 | msec = 0; executed (the execution status of this line is deduced): msec = 0; | - |
| 281 | goto recalculate; executed: goto recalculate;Execution Count:1238 | 1238 |
| 282 | } else if (max == 1000) { evaluated: max == 1000| yes Evaluation Count:393 | yes Evaluation Count:6476 |
| 393-6476 |
| 283 | msec = 1000; executed (the execution status of this line is deduced): msec = 1000; | - |
| 284 | goto recalculate; executed: goto recalculate;Execution Count:393 | 393 |
| 285 | } | - |
| 286 | | - |
| 287 | uint wantedBoundaryMultiple; executed (the execution status of this line is deduced): uint wantedBoundaryMultiple; | - |
| 288 | | - |
| 289 | // 2) if the interval is a multiple of 500 ms and > 5000 ms, we'll always round | - |
| 290 | // towards a round-to-the-second | - |
| 291 | // 3) if the interval is a multiple of 500 ms, we'll round towards the nearest | - |
| 292 | // multiple of 500 ms | - |
| 293 | if ((interval % 500) == 0) { evaluated: (interval % 500) == 0| yes Evaluation Count:4482 | yes Evaluation Count:1994 |
| 1994-4482 |
| 294 | if (interval >= 5000) { evaluated: interval >= 5000| yes Evaluation Count:228 | yes Evaluation Count:4254 |
| 228-4254 |
| 295 | msec = msec >= 500 ? max : min; evaluated: msec >= 500| yes Evaluation Count:168 | yes Evaluation Count:60 |
| 60-168 |
| 296 | goto recalculate; executed: goto recalculate;Execution Count:228 | 228 |
| 297 | } else { | - |
| 298 | wantedBoundaryMultiple = 500; executed (the execution status of this line is deduced): wantedBoundaryMultiple = 500; | - |
| 299 | } executed: }Execution Count:4254 | 4254 |
| 300 | } else if ((interval % 50) == 0) { evaluated: (interval % 50) == 0| yes Evaluation Count:1986 | yes Evaluation Count:8 |
| 8-1986 |
| 301 | // 4) same for multiples of 250, 200, 100, 50 | - |
| 302 | uint mult50 = interval / 50; executed (the execution status of this line is deduced): uint mult50 = interval / 50; | - |
| 303 | if ((mult50 % 4) == 0) { evaluated: (mult50 % 4) == 0| yes Evaluation Count:903 | yes Evaluation Count:1083 |
| 903-1083 |
| 304 | // multiple of 200 | - |
| 305 | wantedBoundaryMultiple = 200; executed (the execution status of this line is deduced): wantedBoundaryMultiple = 200; | - |
| 306 | } else if ((mult50 % 2) == 0) { executed: }Execution Count:903 evaluated: (mult50 % 2) == 0| yes Evaluation Count:1023 | yes Evaluation Count:60 |
| 60-1023 |
| 307 | // multiple of 100 | - |
| 308 | wantedBoundaryMultiple = 100; executed (the execution status of this line is deduced): wantedBoundaryMultiple = 100; | - |
| 309 | } else if ((mult50 % 5) == 0) { executed: }Execution Count:1023 evaluated: (mult50 % 5) == 0| yes Evaluation Count:6 | yes Evaluation Count:54 |
| 6-1023 |
| 310 | // multiple of 250 | - |
| 311 | wantedBoundaryMultiple = 250; executed (the execution status of this line is deduced): wantedBoundaryMultiple = 250; | - |
| 312 | } else { executed: }Execution Count:6 | 6 |
| 313 | // multiple of 50 | - |
| 314 | wantedBoundaryMultiple = 50; executed (the execution status of this line is deduced): wantedBoundaryMultiple = 50; | - |
| 315 | } executed: }Execution Count:54 | 54 |
| 316 | } else { | - |
| 317 | wantedBoundaryMultiple = 25; executed (the execution status of this line is deduced): wantedBoundaryMultiple = 25; | - |
| 318 | } executed: }Execution Count:8 | 8 |
| 319 | | - |
| 320 | uint base = msec / wantedBoundaryMultiple * wantedBoundaryMultiple; executed (the execution status of this line is deduced): uint base = msec / wantedBoundaryMultiple * wantedBoundaryMultiple; | - |
| 321 | uint middlepoint = base + wantedBoundaryMultiple / 2; executed (the execution status of this line is deduced): uint middlepoint = base + wantedBoundaryMultiple / 2; | - |
| 322 | if (msec < middlepoint) evaluated: msec < middlepoint| yes Evaluation Count:3594 | yes Evaluation Count:2654 |
| 2654-3594 |
| 323 | msec = qMax(base, min); executed: msec = qMax(base, min);Execution Count:3594 | 3594 |
| 324 | else | - |
| 325 | msec = qMin(base + wantedBoundaryMultiple, max); executed: msec = qMin(base + wantedBoundaryMultiple, max);Execution Count:2654 | 2654 |
| 326 | } | - |
| 327 | | - |
| 328 | recalculate: code before this statement executed: recalculate:Execution Count:7594 | 7594 |
| 329 | if (msec == 1000u) { evaluated: msec == 1000u| yes Evaluation Count:393 | yes Evaluation Count:9060 |
| 393-9060 |
| 330 | ++t->timeout.tv_sec; executed (the execution status of this line is deduced): ++t->timeout.tv_sec; | - |
| 331 | t->timeout.tv_usec = 0; executed (the execution status of this line is deduced): t->timeout.tv_usec = 0; | - |
| 332 | } else { executed: }Execution Count:393 | 393 |
| 333 | t->timeout.tv_usec = msec * 1000; executed (the execution status of this line is deduced): t->timeout.tv_usec = msec * 1000; | - |
| 334 | } executed: }Execution Count:9060 | 9060 |
| 335 | | - |
| 336 | if (t->timeout < currentTime) partially evaluated: t->timeout < currentTime| no Evaluation Count:0 | yes Evaluation Count:9453 |
| 0-9453 |
| 337 | t->timeout += interval; never executed: t->timeout += interval; | 0 |
| 338 | } executed: }Execution Count:9453 | 9453 |
| 339 | | - |
| 340 | static void calculateNextTimeout(QTimerInfo *t, timeval currentTime) | - |
| 341 | { | - |
| 342 | switch (t->timerType) { | - |
| 343 | case Qt::PreciseTimer: | - |
| 344 | case Qt::CoarseTimer: | - |
| 345 | t->timeout += t->interval; executed (the execution status of this line is deduced): t->timeout += t->interval; | - |
| 346 | if (t->timeout < currentTime) { evaluated: t->timeout < currentTime| yes Evaluation Count:36769 | yes Evaluation Count:5234 |
| 5234-36769 |
| 347 | t->timeout = currentTime; executed (the execution status of this line is deduced): t->timeout = currentTime; | - |
| 348 | t->timeout += t->interval; executed (the execution status of this line is deduced): t->timeout += t->interval; | - |
| 349 | } executed: }Execution Count:36769 | 36769 |
| 350 | #ifdef QTIMERINFO_DEBUG | - |
| 351 | t->expected += t->interval; | - |
| 352 | if (t->expected < currentTime) { | - |
| 353 | t->expected = currentTime; | - |
| 354 | t->expected += t->interval; | - |
| 355 | } | - |
| 356 | #endif | - |
| 357 | if (t->timerType == Qt::CoarseTimer) evaluated: t->timerType == Qt::CoarseTimer| yes Evaluation Count:2276 | yes Evaluation Count:39727 |
| 2276-39727 |
| 358 | calculateCoarseTimerTimeout(t, currentTime); executed: calculateCoarseTimerTimeout(t, currentTime);Execution Count:2276 | 2276 |
| 359 | return; executed: return;Execution Count:42003 | 42003 |
| 360 | | - |
| 361 | case Qt::VeryCoarseTimer: | - |
| 362 | // we don't need to take care of the microsecond component of t->interval | - |
| 363 | t->timeout.tv_sec += t->interval; executed (the execution status of this line is deduced): t->timeout.tv_sec += t->interval; | - |
| 364 | if (t->timeout.tv_sec <= currentTime.tv_sec) partially evaluated: t->timeout.tv_sec <= currentTime.tv_sec| no Evaluation Count:0 | yes Evaluation Count:136 |
| 0-136 |
| 365 | t->timeout.tv_sec = currentTime.tv_sec + t->interval; never executed: t->timeout.tv_sec = currentTime.tv_sec + t->interval; | 0 |
| 366 | #ifdef QTIMERINFO_DEBUG | - |
| 367 | t->expected.tv_sec += t->interval; | - |
| 368 | if (t->expected.tv_sec <= currentTime.tv_sec) | - |
| 369 | t->expected.tv_sec = currentTime.tv_sec + t->interval; | - |
| 370 | #endif | - |
| 371 | return; executed: return;Execution Count:136 | 136 |
| 372 | } | - |
| 373 | | - |
| 374 | #ifdef QTIMERINFO_DEBUG | - |
| 375 | if (t->timerType != Qt::PreciseTimer) | - |
| 376 | qDebug() << "timer" << t->timerType << hex << t->id << dec << "interval" << t->interval | - |
| 377 | << "originally expected at" << t->expected << "will fire at" << t->timeout | - |
| 378 | << "or" << (t->timeout - t->expected) << "s late"; | - |
| 379 | #endif | - |
| 380 | } | 0 |
| 381 | | - |
| 382 | /* | - |
| 383 | Returns the time to wait for the next timer, or null if no timers | - |
| 384 | are waiting. | - |
| 385 | */ | - |
| 386 | bool QTimerInfoList::timerWait(timeval &tm) | - |
| 387 | { | - |
| 388 | timeval currentTime = updateCurrentTime(); executed (the execution status of this line is deduced): timeval currentTime = updateCurrentTime(); | - |
| 389 | repairTimersIfNeeded(); executed (the execution status of this line is deduced): repairTimersIfNeeded(); | - |
| 390 | | - |
| 391 | // Find first waiting timer not already active | - |
| 392 | QTimerInfo *t = 0; executed (the execution status of this line is deduced): QTimerInfo *t = 0; | - |
| 393 | for (QTimerInfoList::const_iterator it = constBegin(); it != constEnd(); ++it) { evaluated: it != constEnd()| yes Evaluation Count:301604 | yes Evaluation Count:324962 |
| 301604-324962 |
| 394 | if (!(*it)->activateRef) { evaluated: !(*it)->activateRef| yes Evaluation Count:301591 | yes Evaluation Count:13 |
| 13-301591 |
| 395 | t = *it; executed (the execution status of this line is deduced): t = *it; | - |
| 396 | break; executed: break;Execution Count:301591 | 301591 |
| 397 | } | - |
| 398 | } executed: }Execution Count:13 | 13 |
| 399 | | - |
| 400 | if (!t) evaluated: !t| yes Evaluation Count:324950 | yes Evaluation Count:301591 |
| 301591-324950 |
| 401 | return false; executed: return false;Execution Count:324944 | 324944 |
| 402 | | - |
| 403 | if (currentTime < t->timeout) { evaluated: currentTime < t->timeout| yes Evaluation Count:263162 | yes Evaluation Count:38429 |
| 38429-263162 |
| 404 | // time to wait | - |
| 405 | tm = roundToMillisecond(t->timeout - currentTime); executed (the execution status of this line is deduced): tm = roundToMillisecond(t->timeout - currentTime); | - |
| 406 | } else { executed: }Execution Count:263162 | 263162 |
| 407 | // no time to wait | - |
| 408 | tm.tv_sec = 0; executed (the execution status of this line is deduced): tm.tv_sec = 0; | - |
| 409 | tm.tv_usec = 0; executed (the execution status of this line is deduced): tm.tv_usec = 0; | - |
| 410 | } executed: }Execution Count:38429 | 38429 |
| 411 | | - |
| 412 | return true; executed: return true;Execution Count:301591 | 301591 |
| 413 | } | - |
| 414 | | - |
| 415 | /* | - |
| 416 | Returns the timer's remaining time in milliseconds with the given timerId, or | - |
| 417 | null if there is nothing left. If the timer id is not found in the list, the | - |
| 418 | returned value will be -1. If the timer is overdue, the returned value will be 0. | - |
| 419 | */ | - |
| 420 | int QTimerInfoList::timerRemainingTime(int timerId) | - |
| 421 | { | - |
| 422 | timeval currentTime = updateCurrentTime(); executed (the execution status of this line is deduced): timeval currentTime = updateCurrentTime(); | - |
| 423 | repairTimersIfNeeded(); executed (the execution status of this line is deduced): repairTimersIfNeeded(); | - |
| 424 | timeval tm = {0, 0}; executed (the execution status of this line is deduced): timeval tm = {0, 0}; | - |
| 425 | | - |
| 426 | for (int i = 0; i < count(); ++i) { partially evaluated: i < count()| yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
| 427 | register QTimerInfo *t = at(i); executed (the execution status of this line is deduced): register QTimerInfo *t = at(i); | - |
| 428 | if (t->id == timerId) { partially evaluated: t->id == timerId| yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
| 429 | if (currentTime < t->timeout) { partially evaluated: currentTime < t->timeout| yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
| 430 | // time to wait | - |
| 431 | tm = roundToMillisecond(t->timeout - currentTime); executed (the execution status of this line is deduced): tm = roundToMillisecond(t->timeout - currentTime); | - |
| 432 | return tm.tv_sec*1000 + tm.tv_usec/1000; executed: return tm.tv_sec*1000 + tm.tv_usec/1000;Execution Count:1 | 1 |
| 433 | } else { | - |
| 434 | return 0; never executed: return 0; | 0 |
| 435 | } | - |
| 436 | } | - |
| 437 | } | 0 |
| 438 | | - |
| 439 | #ifndef QT_NO_DEBUG | - |
| 440 | qWarning("QTimerInfoList::timerRemainingTime: timer id %i not found", timerId); | - |
| 441 | #endif | - |
| 442 | | - |
| 443 | return -1; never executed: return -1; | 0 |
| 444 | } | - |
| 445 | | - |
| 446 | void QTimerInfoList::registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject *object) | - |
| 447 | { | - |
| 448 | QTimerInfo *t = new QTimerInfo; executed (the execution status of this line is deduced): QTimerInfo *t = new QTimerInfo; | - |
| 449 | t->id = timerId; executed (the execution status of this line is deduced): t->id = timerId; | - |
| 450 | t->interval = interval; executed (the execution status of this line is deduced): t->interval = interval; | - |
| 451 | t->timerType = timerType; executed (the execution status of this line is deduced): t->timerType = timerType; | - |
| 452 | t->obj = object; executed (the execution status of this line is deduced): t->obj = object; | - |
| 453 | t->activateRef = 0; executed (the execution status of this line is deduced): t->activateRef = 0; | - |
| 454 | | - |
| 455 | timeval expected = updateCurrentTime() + interval; executed (the execution status of this line is deduced): timeval expected = updateCurrentTime() + interval; | - |
| 456 | | - |
| 457 | switch (timerType) { | - |
| 458 | case Qt::PreciseTimer: | - |
| 459 | // high precision timer is based on millisecond precision | - |
| 460 | // so no adjustment is necessary | - |
| 461 | t->timeout = expected; executed (the execution status of this line is deduced): t->timeout = expected; | - |
| 462 | break; executed: break;Execution Count:876 | 876 |
| 463 | | - |
| 464 | case Qt::CoarseTimer: | - |
| 465 | // this timer has up to 5% coarseness | - |
| 466 | // so our boundaries are 20 ms and 20 s | - |
| 467 | // below 20 ms, 5% inaccuracy is below 1 ms, so we convert to high precision | - |
| 468 | // above 20 s, 5% inaccuracy is above 1 s, so we convert to VeryCoarseTimer | - |
| 469 | if (interval >= 20000) { evaluated: interval >= 20000| yes Evaluation Count:4755 | yes Evaluation Count:126785 |
| 4755-126785 |
| 470 | t->timerType = Qt::VeryCoarseTimer; executed (the execution status of this line is deduced): t->timerType = Qt::VeryCoarseTimer; | - |
| 471 | // fall through | - |
| 472 | } else { executed: }Execution Count:4755 | 4755 |
| 473 | t->timeout = expected; executed (the execution status of this line is deduced): t->timeout = expected; | - |
| 474 | if (interval <= 20) { evaluated: interval <= 20| yes Evaluation Count:119608 | yes Evaluation Count:7177 |
| 7177-119608 |
| 475 | t->timerType = Qt::PreciseTimer; executed (the execution status of this line is deduced): t->timerType = Qt::PreciseTimer; | - |
| 476 | // no adjustment is necessary | - |
| 477 | } else if (interval <= 20000) { executed: }Execution Count:119608 partially evaluated: interval <= 20000| yes Evaluation Count:7177 | no Evaluation Count:0 |
| 0-119608 |
| 478 | calculateCoarseTimerTimeout(t, currentTime); executed (the execution status of this line is deduced): calculateCoarseTimerTimeout(t, currentTime); | - |
| 479 | } executed: }Execution Count:7177 | 7177 |
| 480 | break; executed: break;Execution Count:126785 | 126785 |
| 481 | } | - |
| 482 | // fall through | - |
| 483 | case Qt::VeryCoarseTimer: code before this statement executed: case Qt::VeryCoarseTimer:Execution Count:4755 | 4755 |
| 484 | // the very coarse timer is based on full second precision, | - |
| 485 | // so we keep the interval in seconds (round to closest second) | - |
| 486 | t->interval /= 500; executed (the execution status of this line is deduced): t->interval /= 500; | - |
| 487 | t->interval += 1; executed (the execution status of this line is deduced): t->interval += 1; | - |
| 488 | t->interval >>= 1; executed (the execution status of this line is deduced): t->interval >>= 1; | - |
| 489 | t->timeout.tv_sec = currentTime.tv_sec + t->interval; executed (the execution status of this line is deduced): t->timeout.tv_sec = currentTime.tv_sec + t->interval; | - |
| 490 | t->timeout.tv_usec = 0; executed (the execution status of this line is deduced): t->timeout.tv_usec = 0; | - |
| 491 | | - |
| 492 | // if we're past the half-second mark, increase the timeout again | - |
| 493 | if (currentTime.tv_usec > 500*1000) evaluated: currentTime.tv_usec > 500*1000| yes Evaluation Count:1748 | yes Evaluation Count:3008 |
| 1748-3008 |
| 494 | ++t->timeout.tv_sec; executed: ++t->timeout.tv_sec;Execution Count:1748 | 1748 |
| 495 | } executed: }Execution Count:4756 | 4756 |
| 496 | | - |
| 497 | timerInsert(t); executed (the execution status of this line is deduced): timerInsert(t); | - |
| 498 | | - |
| 499 | #ifdef QTIMERINFO_DEBUG | - |
| 500 | t->expected = expected; | - |
| 501 | t->cumulativeError = 0; | - |
| 502 | t->count = 0; | - |
| 503 | if (t->timerType != Qt::PreciseTimer) | - |
| 504 | qDebug() << "timer" << t->timerType << hex <<t->id << dec << "interval" << t->interval << "expected at" | - |
| 505 | << t->expected << "will fire first at" << t->timeout; | - |
| 506 | #endif | - |
| 507 | } executed: }Execution Count:132417 | 132417 |
| 508 | | - |
| 509 | bool QTimerInfoList::unregisterTimer(int timerId) | - |
| 510 | { | - |
| 511 | // set timer inactive | - |
| 512 | for (int i = 0; i < count(); ++i) { partially evaluated: i < count()| yes Evaluation Count:62560525 | no Evaluation Count:0 |
| 0-62560525 |
| 513 | register QTimerInfo *t = at(i); executed (the execution status of this line is deduced): register QTimerInfo *t = at(i); | - |
| 514 | if (t->id == timerId) { evaluated: t->id == timerId| yes Evaluation Count:129527 | yes Evaluation Count:62430998 |
| 129527-62430998 |
| 515 | // found it | - |
| 516 | removeAt(i); executed (the execution status of this line is deduced): removeAt(i); | - |
| 517 | if (t == firstTimerInfo) evaluated: t == firstTimerInfo| yes Evaluation Count:12259 | yes Evaluation Count:117268 |
| 12259-117268 |
| 518 | firstTimerInfo = 0; executed: firstTimerInfo = 0;Execution Count:12259 | 12259 |
| 519 | if (t->activateRef) evaluated: t->activateRef| yes Evaluation Count:12282 | yes Evaluation Count:117245 |
| 12282-117245 |
| 520 | *(t->activateRef) = 0; executed: *(t->activateRef) = 0;Execution Count:12282 | 12282 |
| 521 | delete t; executed (the execution status of this line is deduced): delete t; | - |
| 522 | return true; executed: return true;Execution Count:129527 | 129527 |
| 523 | } | - |
| 524 | } executed: }Execution Count:62430998 | 62430998 |
| 525 | // id not found | - |
| 526 | return false; never executed: return false; | 0 |
| 527 | } | - |
| 528 | | - |
| 529 | bool QTimerInfoList::unregisterTimers(QObject *object) | - |
| 530 | { | - |
| 531 | if (isEmpty()) evaluated: isEmpty()| yes Evaluation Count:2 | yes Evaluation Count:1179 |
| 2-1179 |
| 532 | return false; executed: return false;Execution Count:2 | 2 |
| 533 | for (int i = 0; i < count(); ++i) { evaluated: i < count()| yes Evaluation Count:3800 | yes Evaluation Count:1179 |
| 1179-3800 |
| 534 | register QTimerInfo *t = at(i); executed (the execution status of this line is deduced): register QTimerInfo *t = at(i); | - |
| 535 | if (t->obj == object) { evaluated: t->obj == object| yes Evaluation Count:1228 | yes Evaluation Count:2572 |
| 1228-2572 |
| 536 | // object found | - |
| 537 | removeAt(i); executed (the execution status of this line is deduced): removeAt(i); | - |
| 538 | if (t == firstTimerInfo) partially evaluated: t == firstTimerInfo| no Evaluation Count:0 | yes Evaluation Count:1228 |
| 0-1228 |
| 539 | firstTimerInfo = 0; never executed: firstTimerInfo = 0; | 0 |
| 540 | if (t->activateRef) partially evaluated: t->activateRef| no Evaluation Count:0 | yes Evaluation Count:1228 |
| 0-1228 |
| 541 | *(t->activateRef) = 0; never executed: *(t->activateRef) = 0; | 0 |
| 542 | delete t; executed (the execution status of this line is deduced): delete t; | - |
| 543 | // move back one so that we don't skip the new current item | - |
| 544 | --i; executed (the execution status of this line is deduced): --i; | - |
| 545 | } executed: }Execution Count:1228 | 1228 |
| 546 | } executed: }Execution Count:3800 | 3800 |
| 547 | return true; executed: return true;Execution Count:1179 | 1179 |
| 548 | } | - |
| 549 | | - |
| 550 | QList<QAbstractEventDispatcher::TimerInfo> QTimerInfoList::registeredTimers(QObject *object) const | - |
| 551 | { | - |
| 552 | QList<QAbstractEventDispatcher::TimerInfo> list; executed (the execution status of this line is deduced): QList<QAbstractEventDispatcher::TimerInfo> list; | - |
| 553 | for (int i = 0; i < count(); ++i) { evaluated: i < count()| yes Evaluation Count:31186 | yes Evaluation Count:23300 |
| 23300-31186 |
| 554 | register const QTimerInfo * const t = at(i); executed (the execution status of this line is deduced): register const QTimerInfo * const t = at(i); | - |
| 555 | if (t->obj == object) { evaluated: t->obj == object| yes Evaluation Count:9 | yes Evaluation Count:31177 |
| 9-31177 |
| 556 | list << QAbstractEventDispatcher::TimerInfo(t->id, executed (the execution status of this line is deduced): list << QAbstractEventDispatcher::TimerInfo(t->id, | - |
| 557 | (t->timerType == Qt::VeryCoarseTimer executed (the execution status of this line is deduced): (t->timerType == Qt::VeryCoarseTimer | - |
| 558 | ? t->interval * 1000 executed (the execution status of this line is deduced): ? t->interval * 1000 | - |
| 559 | : t->interval), executed (the execution status of this line is deduced): : t->interval), | - |
| 560 | t->timerType); executed (the execution status of this line is deduced): t->timerType); | - |
| 561 | } executed: }Execution Count:9 | 9 |
| 562 | } executed: }Execution Count:31186 | 31186 |
| 563 | return list; executed: return list;Execution Count:23301 | 23301 |
| 564 | } | - |
| 565 | | - |
| 566 | /* | - |
| 567 | Activate pending timers, returning how many where activated. | - |
| 568 | */ | - |
| 569 | int QTimerInfoList::activateTimers() | - |
| 570 | { | - |
| 571 | if (qt_disable_lowpriority_timers || isEmpty()) partially evaluated: qt_disable_lowpriority_timers| no Evaluation Count:0 | yes Evaluation Count:40996 |
evaluated: isEmpty()| yes Evaluation Count:13 | yes Evaluation Count:40983 |
| 0-40996 |
| 572 | return 0; // nothing to do executed: return 0;Execution Count:13 | 13 |
| 573 | | - |
| 574 | int n_act = 0, maxCount = 0; executed (the execution status of this line is deduced): int n_act = 0, maxCount = 0; | - |
| 575 | firstTimerInfo = 0; executed (the execution status of this line is deduced): firstTimerInfo = 0; | - |
| 576 | | - |
| 577 | timeval currentTime = updateCurrentTime(); executed (the execution status of this line is deduced): timeval currentTime = updateCurrentTime(); | - |
| 578 | // qDebug() << "Thread" << QThread::currentThreadId() << "woken up at" << currentTime; | - |
| 579 | repairTimersIfNeeded(); executed (the execution status of this line is deduced): repairTimersIfNeeded(); | - |
| 580 | | - |
| 581 | | - |
| 582 | // Find out how many timer have expired | - |
| 583 | for (QTimerInfoList::const_iterator it = constBegin(); it != constEnd(); ++it) { evaluated: it != constEnd()| yes Evaluation Count:54292 | yes Evaluation Count:28977 |
| 28977-54292 |
| 584 | if (currentTime < (*it)->timeout) evaluated: currentTime < (*it)->timeout| yes Evaluation Count:12006 | yes Evaluation Count:42286 |
| 12006-42286 |
| 585 | break; executed: break;Execution Count:12006 | 12006 |
| 586 | maxCount++; executed (the execution status of this line is deduced): maxCount++; | - |
| 587 | } executed: }Execution Count:42286 | 42286 |
| 588 | | - |
| 589 | //fire the timers. | - |
| 590 | while (maxCount--) { evaluated: maxCount--| yes Evaluation Count:42264 | yes Evaluation Count:40858 |
| 40858-42264 |
| 591 | if (isEmpty()) partially evaluated: isEmpty()| no Evaluation Count:0 | yes Evaluation Count:42264 |
| 0-42264 |
| 592 | break; | 0 |
| 593 | | - |
| 594 | QTimerInfo *currentTimerInfo = first(); executed (the execution status of this line is deduced): QTimerInfo *currentTimerInfo = first(); | - |
| 595 | if (currentTime < currentTimerInfo->timeout) evaluated: currentTime < currentTimerInfo->timeout| yes Evaluation Count:125 | yes Evaluation Count:42139 |
| 125-42139 |
| 596 | break; // no timer has expired executed: break;Execution Count:125 | 125 |
| 597 | | - |
| 598 | if (!firstTimerInfo) { evaluated: !firstTimerInfo| yes Evaluation Count:42110 | yes Evaluation Count:29 |
| 29-42110 |
| 599 | firstTimerInfo = currentTimerInfo; executed (the execution status of this line is deduced): firstTimerInfo = currentTimerInfo; | - |
| 600 | } else if (firstTimerInfo == currentTimerInfo) { executed: }Execution Count:42110 partially evaluated: firstTimerInfo == currentTimerInfo| no Evaluation Count:0 | yes Evaluation Count:29 |
| 0-42110 |
| 601 | // avoid sending the same timer multiple times | - |
| 602 | break; | 0 |
| 603 | } else if (currentTimerInfo->interval < firstTimerInfo->interval evaluated: currentTimerInfo->interval < firstTimerInfo->interval| yes Evaluation Count:12 | yes Evaluation Count:17 |
| 12-17 |
| 604 | || currentTimerInfo->interval == firstTimerInfo->interval) { evaluated: currentTimerInfo->interval == firstTimerInfo->interval| yes Evaluation Count:1 | yes Evaluation Count:16 |
| 1-16 |
| 605 | firstTimerInfo = currentTimerInfo; executed (the execution status of this line is deduced): firstTimerInfo = currentTimerInfo; | - |
| 606 | } executed: }Execution Count:13 | 13 |
| 607 | | - |
| 608 | // remove from list | - |
| 609 | removeFirst(); executed (the execution status of this line is deduced): removeFirst(); | - |
| 610 | | - |
| 611 | #ifdef QTIMERINFO_DEBUG | - |
| 612 | float diff; | - |
| 613 | if (currentTime < currentTimerInfo->expected) { | - |
| 614 | // early | - |
| 615 | timeval early = currentTimerInfo->expected - currentTime; | - |
| 616 | diff = -(early.tv_sec + early.tv_usec / 1000000.0); | - |
| 617 | } else { | - |
| 618 | timeval late = currentTime - currentTimerInfo->expected; | - |
| 619 | diff = late.tv_sec + late.tv_usec / 1000000.0; | - |
| 620 | } | - |
| 621 | currentTimerInfo->cumulativeError += diff; | - |
| 622 | ++currentTimerInfo->count; | - |
| 623 | if (currentTimerInfo->timerType != Qt::PreciseTimer) | - |
| 624 | qDebug() << "timer" << currentTimerInfo->timerType << hex << currentTimerInfo->id << dec << "interval" | - |
| 625 | << currentTimerInfo->interval << "firing at" << currentTime | - |
| 626 | << "(orig" << currentTimerInfo->expected << "scheduled at" << currentTimerInfo->timeout | - |
| 627 | << ") off by" << diff << "activation" << currentTimerInfo->count | - |
| 628 | << "avg error" << (currentTimerInfo->cumulativeError / currentTimerInfo->count); | - |
| 629 | #endif | - |
| 630 | | - |
| 631 | // determine next timeout time | - |
| 632 | calculateNextTimeout(currentTimerInfo, currentTime); executed (the execution status of this line is deduced): calculateNextTimeout(currentTimerInfo, currentTime); | - |
| 633 | | - |
| 634 | // reinsert timer | - |
| 635 | timerInsert(currentTimerInfo); executed (the execution status of this line is deduced): timerInsert(currentTimerInfo); | - |
| 636 | if (currentTimerInfo->interval > 0) evaluated: currentTimerInfo->interval > 0| yes Evaluation Count:5389 | yes Evaluation Count:36750 |
| 5389-36750 |
| 637 | n_act++; executed: n_act++;Execution Count:5389 | 5389 |
| 638 | | - |
| 639 | if (!currentTimerInfo->activateRef) { evaluated: !currentTimerInfo->activateRef| yes Evaluation Count:42121 | yes Evaluation Count:18 |
| 18-42121 |
| 640 | // send event, but don't allow it to recurse | - |
| 641 | currentTimerInfo->activateRef = ¤tTimerInfo; executed (the execution status of this line is deduced): currentTimerInfo->activateRef = ¤tTimerInfo; | - |
| 642 | | - |
| 643 | QTimerEvent e(currentTimerInfo->id); executed (the execution status of this line is deduced): QTimerEvent e(currentTimerInfo->id); | - |
| 644 | QCoreApplication::sendEvent(currentTimerInfo->obj, &e); executed (the execution status of this line is deduced): QCoreApplication::sendEvent(currentTimerInfo->obj, &e); | - |
| 645 | | - |
| 646 | if (currentTimerInfo) evaluated: currentTimerInfo| yes Evaluation Count:29839 | yes Evaluation Count:12282 |
| 12282-29839 |
| 647 | currentTimerInfo->activateRef = 0; executed: currentTimerInfo->activateRef = 0;Execution Count:29839 | 29839 |
| 648 | } executed: }Execution Count:42121 | 42121 |
| 649 | } executed: }Execution Count:42139 | 42139 |
| 650 | | - |
| 651 | firstTimerInfo = 0; executed (the execution status of this line is deduced): firstTimerInfo = 0; | - |
| 652 | // qDebug() << "Thread" << QThread::currentThreadId() << "activated" << n_act << "timers"; | - |
| 653 | return n_act; executed: return n_act;Execution Count:40983 | 40983 |
| 654 | } | - |
| 655 | | - |
| 656 | QT_END_NAMESPACE | - |
| 657 | | - |
| | |