Maintain timer sort invariants when changing period

See: https://github.com/OpenTTD/OpenTTD/issues/12509
This commit is contained in:
Jonathan G Rennison
2024-04-20 15:09:49 +01:00
parent 674642f9cc
commit 33baceaef7
2 changed files with 16 additions and 2 deletions

View File

@@ -99,7 +99,7 @@ public:
*/ */
void SetInterval(const TPeriod interval, bool reset = true) void SetInterval(const TPeriod interval, bool reset = true)
{ {
this->period = interval; TimerManager<TTimerType>::ChangeRegisteredTimerPeriod(*this, interval);
if (reset) this->storage = {}; if (reset) this->storage = {};
} }
@@ -151,7 +151,7 @@ public:
*/ */
void Reset(const TPeriod timeout) void Reset(const TPeriod timeout)
{ {
this->period = timeout; TimerManager<TTimerType>::ChangeRegisteredTimerPeriod(*this, timeout);
this->fired = false; this->fired = false;
this->storage = {}; this->storage = {};
} }

View File

@@ -57,6 +57,20 @@ public:
GetTimers().erase(&timer); 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<TTimerType> &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 #ifdef WITH_ASSERT
/** /**
* Validate that a new period is actually valid. * Validate that a new period is actually valid.