From fa42350c8dab14d479014a6b895c0a13ff283acd Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Wed, 21 Jun 2023 16:21:38 +0300 Subject: [PATCH] QTimerInfoList: use std::upper_bound/rotate Change-Id: I80899a8c652ac724b0efd82815dddc061fe9f5e8 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qtimerinfo_unix.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/corelib/kernel/qtimerinfo_unix.cpp b/src/corelib/kernel/qtimerinfo_unix.cpp index 165de17171..bcec650987 100644 --- a/src/corelib/kernel/qtimerinfo_unix.cpp +++ b/src/corelib/kernel/qtimerinfo_unix.cpp @@ -46,18 +46,16 @@ bool QTimerInfoList::hasPendingTimers() return updateCurrentTime() < constFirst()->timeout; } +static bool byTimeout(const QTimerInfo *a, const QTimerInfo *b) +{ return a->timeout < b->timeout; }; + /* insert timer info into list */ void QTimerInfoList::timerInsert(QTimerInfo *ti) { - int index = size(); - while (index--) { - const QTimerInfo * const t = at(index); - if (!(ti->timeout < t->timeout)) - break; - } - insert(index+1, ti); + insert(std::upper_bound(cbegin(), cend(), ti, byTimeout), + ti); } static constexpr milliseconds roundToMillisecond(nanoseconds val) @@ -420,14 +418,16 @@ int QTimerInfoList::activateTimers() firstTimerInfo = currentTimerInfo; } - // remove from list - removeFirst(); - // determine next timeout time calculateNextTimeout(currentTimerInfo, now); + if (size() > 1) { + // Find where "currentTimerInfo" should be in the list so as + // to keep the list ordered by timeout + auto afterCurrentIt = begin() + 1; + auto iter = std::upper_bound(afterCurrentIt, end(), currentTimerInfo, byTimeout); + currentTimerInfo = *std::rotate(begin(), afterCurrentIt, iter); + } - // reinsert timer - timerInsert(currentTimerInfo); if (currentTimerInfo->interval > 0ms) n_act++;