From 33baceaef79309c778e43512dd70ed5889397b73 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 20 Apr 2024 15:09:49 +0100 Subject: [PATCH] Maintain timer sort invariants when changing period See: https://github.com/OpenTTD/OpenTTD/issues/12509 --- src/timer/timer.h | 4 ++-- src/timer/timer_manager.h | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/timer/timer.h b/src/timer/timer.h index 7a20dc3888..f6b433ef8c 100644 --- a/src/timer/timer.h +++ b/src/timer/timer.h @@ -99,7 +99,7 @@ public: */ void SetInterval(const TPeriod interval, bool reset = true) { - this->period = interval; + TimerManager::ChangeRegisteredTimerPeriod(*this, interval); if (reset) this->storage = {}; } @@ -151,7 +151,7 @@ public: */ void Reset(const TPeriod timeout) { - this->period = timeout; + TimerManager::ChangeRegisteredTimerPeriod(*this, timeout); this->fired = false; this->storage = {}; } diff --git a/src/timer/timer_manager.h b/src/timer/timer_manager.h index 118c311854..b1f3db46f0 100644 --- a/src/timer/timer_manager.h +++ b/src/timer/timer_manager.h @@ -57,6 +57,20 @@ public: GetTimers().erase(&timer); } + /** + * Change the period of a registered timer. + * + * @param timer The timer to change the period of. + * @param new_period The new period value. + */ + static void ChangeRegisteredTimerPeriod(BaseTimer &timer, TPeriod new_period) + { + /* Unregistration and re-registration is necessary because the period is used as the sort key in base_timer_sorter */ + UnregisterTimer(timer); + timer.period = new_period; + RegisterTimer(timer); + } + #ifdef WITH_ASSERT /** * Validate that a new period is actually valid.