Maintain timer sort invariants when changing period

See: https://github.com/OpenTTD/OpenTTD/issues/12509
pull/688/head
Jonathan G Rennison 4 weeks ago
parent 674642f9cc
commit 33baceaef7

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

@ -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<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
/**
* Validate that a new period is actually valid.

Loading…
Cancel
Save