From f7fd2b08132e3626a3b79c11abee30505f3f30f4 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 12 Jul 2021 16:56:50 -0700 Subject: [PATCH] [timer] add `RemoveAll()` method for use by unit test (#6814) This commit adds a new static method `Timer::RemoveAll()` which removes all running timers from the `Scheduler`. This method is only intended for use by by `test_timer` unit test, allowing it to remove any timers that may be started from constructors of different objects in an OT instance before starting the unit test. With this change, we can have timers started from constructors. To ensure that the `RemoveAll()` is only used by the unit test, it is defined as a `protected` method which can still be used in the test which defines and uses `TestTimer` as a sub-class of `Timer`. --- src/core/common/timer.cpp | 22 ++++++++++++++++++++++ src/core/common/timer.hpp | 9 +++++++++ tests/unit/test_timer.cpp | 5 +++++ 3 files changed, 36 insertions(+) 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();