diff --git a/src/common/mainloop.cpp b/src/common/mainloop.cpp index f2024fbbe4a..73fd073c73a 100644 --- a/src/common/mainloop.cpp +++ b/src/common/mainloop.cpp @@ -33,11 +33,11 @@ namespace otbr { MainloopProcessor::MainloopProcessor(void) { - MainloopManager::GetInstance().AddMainloopProcessor(this); + MainloopManager::GetInstance().AddMainloopProcessor(*this); } MainloopProcessor::~MainloopProcessor(void) { - MainloopManager::GetInstance().RemoveMainloopProcessor(this); + MainloopManager::GetInstance().RemoveMainloopProcessor(*this); } } // namespace otbr diff --git a/src/common/mainloop_manager.cpp b/src/common/mainloop_manager.cpp index 93c73bfbf91..c595d08c40a 100644 --- a/src/common/mainloop_manager.cpp +++ b/src/common/mainloop_manager.cpp @@ -31,15 +31,29 @@ namespace otbr { -void MainloopManager::AddMainloopProcessor(MainloopProcessor *aMainloopProcessor) +MainloopManager::MainloopManager(void) + : mProcessing(false) { - assert(aMainloopProcessor != nullptr); - mMainloopProcessorList.emplace_back(aMainloopProcessor); } -void MainloopManager::RemoveMainloopProcessor(MainloopProcessor *aMainloopProcessor) +void MainloopManager::AddMainloopProcessor(MainloopProcessor &aMainloopProcessor) { - mMainloopProcessorList.remove(aMainloopProcessor); + mToAdd.emplace_back(&aMainloopProcessor); + + if (!mProcessing) + { + UpdateList(); + } +} + +void MainloopManager::RemoveMainloopProcessor(MainloopProcessor &aMainloopProcessor) +{ + mToRemove.emplace_back(&aMainloopProcessor); + + if (!mProcessing) + { + UpdateList(); + } } void MainloopManager::Update(MainloopContext &aMainloop) @@ -52,9 +66,30 @@ void MainloopManager::Update(MainloopContext &aMainloop) void MainloopManager::Process(const MainloopContext &aMainloop) { - for (auto &mainloopProcessor : mMainloopProcessorList) + mProcessing = true; + + for (auto &mainloopProcessor : mList) { mainloopProcessor->Process(aMainloop); } + + mProcessing = false; + UpdateList(); +} + +void MainloopManager::UpdateList(void) +{ + assert(!mProcessing); + + mList.instert(mList.end(), mToAdd.begin(), mToAdd.end()); + + for (auto &processor : mToRemove) + { + mList.remove(processor); + } + + mToAdd.clear(); + mToRemove.clear(); } + } // namespace otbr diff --git a/src/common/mainloop_manager.hpp b/src/common/mainloop_manager.hpp index 381ebfb53e8..573f0ff8df4 100644 --- a/src/common/mainloop_manager.hpp +++ b/src/common/mainloop_manager.hpp @@ -57,7 +57,7 @@ class MainloopManager : private NonCopyable * The constructor to initialize the mainloop manager. * */ - MainloopManager() = default; + MainloopManager(void); /** * This method returns the singleton instance of the mainloop manager. @@ -72,18 +72,18 @@ class MainloopManager : private NonCopyable /** * This method adds a mainloop processors to the mainloop managger. * - * @param[in] aMainloopProcessor A pointer to the mainloop processor. + * @param[in] aMainloopProcessor A mainloop processor. * */ - void AddMainloopProcessor(MainloopProcessor *aMainloopProcessor); + void AddMainloopProcessor(MainloopProcessor &aMainloopProcessor); /** * This method removes a mainloop processors from the mainloop managger. * - * @param[in] aMainloopProcessor A pointer to the mainloop processor. + * @param[in] aMainloopProcessor A mainloop processor. * */ - void RemoveMainloopProcessor(MainloopProcessor *aMainloopProcessor); + void RemoveMainloopProcessor(MainloopProcessor &aMainloopProcessor); /** * This method updates the mainloop context of all mainloop processors. @@ -102,7 +102,12 @@ class MainloopManager : private NonCopyable void Process(const MainloopContext &aMainloop); private: - std::list mMainloopProcessorList; + void UpdateList(void); + + std::list mList; + std::list mToRemove; + std::list mToAdd; + bool mProcessing; }; } // namespace otbr #endif // OTBR_COMMON_MAINLOOP_MANAGER_HPP_