summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2024-02-14 11:31:36 -0800
committerThiago Macieira <thiago.macieira@intel.com>2024-03-13 17:29:12 -0800
commitafa86c60e6b6513c5c34b3832a5ece526c071c3f (patch)
tree4c3fa9df61324505d751e9b25cb61c1458ce47e6 /src/corelib/kernel
parent7ce75b1a2bd9f22a7b2b83d48df875c68a47b390 (diff)
QTimerInfo: correct CoarseTimer beyond the [20ms,20s] range earlier
Simplifies some code. Pick-to: 6.7 Change-Id: I83dda2d36c904517b3c0fffd17b3d18f2dfbc2b3 Reviewed-by: Ahmad Samir <a.samirh78@gmail.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qtimerinfo_unix.cpp34
1 files changed, 16 insertions, 18 deletions
diff --git a/src/corelib/kernel/qtimerinfo_unix.cpp b/src/corelib/kernel/qtimerinfo_unix.cpp
index 484ca89945..da570eded2 100644
--- a/src/corelib/kernel/qtimerinfo_unix.cpp
+++ b/src/corelib/kernel/qtimerinfo_unix.cpp
@@ -286,8 +286,19 @@ void QTimerInfoList::registerTimer(int timerId, qint64 interval, Qt::TimerType t
void QTimerInfoList::registerTimer(int timerId, milliseconds interval,
Qt::TimerType timerType, QObject *object)
{
- QTimerInfo *t = new QTimerInfo(timerId, interval, timerType, object);
+ // correct the timer type first
+ if (timerType == Qt::CoarseTimer) {
+ // this timer has up to 5% coarseness
+ // so our boundaries are 20 ms and 20 s
+ // below 20 ms, 5% inaccuracy is below 1 ms, so we convert to high precision
+ // above 20 s, 5% inaccuracy is above 1 s, so we convert to VeryCoarseTimer
+ if (interval >= 20s)
+ timerType = Qt::VeryCoarseTimer;
+ else if (interval <= 20ms)
+ timerType = Qt::PreciseTimer;
+ }
+ QTimerInfo *t = new QTimerInfo(timerId, interval, timerType, object);
steady_clock::time_point expected = updateCurrentTime() + interval;
switch (timerType) {
@@ -298,23 +309,10 @@ void QTimerInfoList::registerTimer(int timerId, milliseconds interval,
break;
case Qt::CoarseTimer:
- // this timer has up to 5% coarseness
- // so our boundaries are 20 ms and 20 s
- // below 20 ms, 5% inaccuracy is below 1 ms, so we convert to high precision
- // above 20 s, 5% inaccuracy is above 1 s, so we convert to VeryCoarseTimer
- if (interval >= 20s) {
- t->timerType = Qt::VeryCoarseTimer;
- } else {
- t->timeout = expected;
- if (interval <= 20ms) {
- t->timerType = Qt::PreciseTimer;
- // no adjustment is necessary
- } else if (interval <= 20s) {
- calculateCoarseTimerTimeout(t, currentTime);
- }
- break;
- }
- Q_FALLTHROUGH();
+ t->timeout = expected;
+ calculateCoarseTimerTimeout(t, currentTime);
+ break;
+
case Qt::VeryCoarseTimer:
t->interval = roundToSecs(t->interval);
const auto currentTimeInSecs = floor<seconds>(currentTime);