From e5b3dca681670baec70df039ca1b0c58701465de Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 14 Feb 2024 11:31:36 -0800 Subject: [PATCH] QTimerInfo: correct CoarseTimer beyond the [20ms,20s] range earlier Simplifies some code. Change-Id: I83dda2d36c904517b3c0fffd17b3d18f2dfbc2b3 Reviewed-by: Ahmad Samir (cherry picked from commit afa86c60e6b6513c5c34b3832a5ece526c071c3f) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qtimerinfo_unix.cpp | 34 ++++++++++++-------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/corelib/kernel/qtimerinfo_unix.cpp b/src/corelib/kernel/qtimerinfo_unix.cpp index 484ca89945d..da570eded2d 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(currentTime);