diff --git a/src/core/common/timer.cpp b/src/core/common/timer.cpp index 59a0ebfca..d560f6de0 100644 --- a/src/core/common/timer.cpp +++ b/src/core/common/timer.cpp @@ -107,6 +107,11 @@ void TimerMilli::Stop(void) Get().Remove(*this); } +void TimerMilli::RemoveAll(Instance &aInstance) +{ + aInstance.Get().RemoveAll(); +} + void Timer::Scheduler::Add(Timer &aTimer, const AlarmApi &aAlarmApi) { Timer *prev = nullptr; @@ -193,6 +198,18 @@ exit: return; } +void Timer::Scheduler::RemoveAll(const AlarmApi &aAlarmApi) +{ + Timer *timer; + + while ((timer = mTimerList.Pop()) != nullptr) + { + timer->SetNext(timer); + } + + SetAlarm(aAlarmApi); +} + extern "C" void otPlatAlarmMilliFired(otInstance *aInstance) { Instance *instance = static_cast(aInstance); @@ -233,6 +250,11 @@ void TimerMicro::Stop(void) Get().Remove(*this); } +void TimerMicro::RemoveAll(Instance &aInstance) +{ + aInstance.Get().RemoveAll(); +} + extern "C" void otPlatAlarmMicroFired(otInstance *aInstance) { Instance *instance = static_cast(aInstance); diff --git a/src/core/common/timer.hpp b/src/core/common/timer.hpp index b109a9721..6489961be 100644 --- a/src/core/common/timer.hpp +++ b/src/core/common/timer.hpp @@ -136,6 +136,7 @@ protected: void Add(Timer &aTimer, const AlarmApi &aAlarmApi); void Remove(Timer &aTimer, const AlarmApi &aAlarmApi); + void RemoveAll(const AlarmApi &aAlarmApi); void ProcessTimers(const AlarmApi &aAlarmApi); void SetAlarm(const AlarmApi &aAlarmApi); @@ -183,6 +184,7 @@ public: private: void Add(TimerMilli &aTimer) { Timer::Scheduler::Add(aTimer, sAlarmMilliApi); } void Remove(TimerMilli &aTimer) { Timer::Scheduler::Remove(aTimer, sAlarmMilliApi); } + void RemoveAll(void) { Timer::Scheduler::RemoveAll(sAlarmMilliApi); } void ProcessTimers(void) { Timer::Scheduler::ProcessTimers(sAlarmMilliApi); } static const AlarmApi sAlarmMilliApi; @@ -247,6 +249,9 @@ public: * */ static TimeMilli GetNow(void) { return TimeMilli(otPlatAlarmMilliGetNow()); } + +protected: + static void RemoveAll(Instance &aInstance); }; /** @@ -322,6 +327,7 @@ public: private: void Add(TimerMicro &aTimer) { Timer::Scheduler::Add(aTimer, sAlarmMicroApi); } void Remove(TimerMicro &aTimer) { Timer::Scheduler::Remove(aTimer, sAlarmMicroApi); } + void RemoveAll(void) { Timer::Scheduler::RemoveAll(sAlarmMicroApi); } void ProcessTimers(void) { Timer::Scheduler::ProcessTimers(sAlarmMicroApi); } static const AlarmApi sAlarmMicroApi; @@ -377,6 +383,9 @@ public: * */ static TimeMicro GetNow(void) { return Time(otPlatAlarmMicroGetNow()); } + +protected: + static void RemoveAll(Instance &aInstance); }; #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE diff --git a/tests/unit/test_timer.cpp b/tests/unit/test_timer.cpp index 427b5a15c..1e469298f 100644 --- a/tests/unit/test_timer.cpp +++ b/tests/unit/test_timer.cpp @@ -104,6 +104,8 @@ public: void ResetFiredCounter(void) { mFiredCounter = 0; } + static void RemoveAll(ot::Instance &aInstance) { TimerType::RemoveAll(aInstance); } + private: uint32_t mFiredCounter; //< Number of times timer has been fired so far }; @@ -134,6 +136,7 @@ template int TestOneTimer(void) // Test one Timer basic operation. + TestTimer::RemoveAll(*instance); InitTestTimer(); InitCounters(); @@ -259,6 +262,7 @@ template int TestTwoTimers(void) TestTimer timer1(*instance); TestTimer timer2(*instance); + TestTimer::RemoveAll(*instance); InitTestTimer(); printf("TestTwoTimers() "); @@ -491,6 +495,7 @@ template static void TenTimers(uint32_t aTimeShift) // Start the Ten timers. + TestTimer::RemoveAll(*instance); InitTestTimer(); InitCounters();