Skip to content

Commit

Permalink
mainloop manager
Browse files Browse the repository at this point in the history
  • Loading branch information
abtink committed Sep 15, 2023
1 parent b425da1 commit 020b5d7
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 14 deletions.
4 changes: 2 additions & 2 deletions src/common/mainloop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
47 changes: 41 additions & 6 deletions src/common/mainloop_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
17 changes: 11 additions & 6 deletions src/common/mainloop_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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.
Expand All @@ -102,7 +102,12 @@ class MainloopManager : private NonCopyable
void Process(const MainloopContext &aMainloop);

private:
std::list<MainloopProcessor *> mMainloopProcessorList;
void UpdateList(void);

std::list<MainloopProcessor *> mList;
std::list<MainloopProcessor *> mToRemove;
std::list<MainloopProcessor *> mToAdd;
bool mProcessing;
};
} // namespace otbr
#endif // OTBR_COMMON_MAINLOOP_MANAGER_HPP_

0 comments on commit 020b5d7

Please sign in to comment.