main #2

Merged
byterazor merged 3 commits from csander/EventManagementSystem:main into main 2022-08-30 18:16:48 +02:00
2 changed files with 53 additions and 18 deletions

View File

@ -70,7 +70,7 @@
std::mutex mutexSchedulingParticipants_; std::mutex mutexSchedulingParticipants_;
/// list of all participants connected /// list of all participants connected
std::list<std::shared_ptr<EventManager::Participant>> particpants_; std::list<std::shared_ptr<EventManager::Participant>> participants_;
/// mutex to protect participants_ /// mutex to protect participants_
std::mutex mutexParticipants_; std::mutex mutexParticipants_;
@ -84,6 +84,12 @@
/// mutex to protect connectionQueue_ /// mutex to protect connectionQueue_
std::mutex mutexConnectionQueue_; std::mutex mutexConnectionQueue_;
/// queue for disable scheduling request so the participants are not scheduled by the manager any longer
std::queue<std::shared_ptr<EventManager::Participant>> disableScheduleQueue_;
/// mutex to protect disableScheduleQueue_
std::mutex mutexDisableScheduleQueue_;
/* /*
* all private methods * all private methods
*/ */
@ -103,9 +109,24 @@
*/ */
void processEvent(const std::shared_ptr<EventManager::Event> event); void processEvent(const std::shared_ptr<EventManager::Event> event);
/**
* @brief adds the queued participants to the list of connected participants
*
* The connectionQueue_ contains the participants that should be connected to
* the manager. All connected participants are stored in the list participants_.
* This class function adds the queued participants to the list participants_
* and removes them from the queue.
*/
void processConnections_(); void processConnections_();
/**
* @brief disables the scheduling of the requested participants
*
* Removes the participants from the schedulingParticipants_ list that
* should not be scheduled anymore.
*/
void processDisableScheduling_();
/** /**
* @brief start the main thread * @brief start the main thread
*/ */

View File

@ -200,6 +200,7 @@
mutexSchedulingParticipants_.unlock(); mutexSchedulingParticipants_.unlock();
processConnections_(); processConnections_();
processDisableScheduling_();
std::this_thread::sleep_for(std::chrono::milliseconds(100)); std::this_thread::sleep_for(std::chrono::milliseconds(100));
} }
@ -331,18 +332,14 @@
} }
} }
void EventManager::Manager::unschedule(std::shared_ptr<EventManager::Participant> participant ) void EventManager::Manager::unschedule(std::shared_ptr<EventManager::Participant> participant )
{ {
std::lock_guard<std::mutex> guard(mutexSchedulingParticipants_); std::lock_guard<std::mutex> guard( mutexDisableScheduleQueue_ );
disableScheduleQueue_.push( participant );
auto it = std::find(schedulingParticipants_.begin(), schedulingParticipants_.end(), participant);
if (it != schedulingParticipants_.end())
{
schedulingParticipants_.erase(it);
}
} }
void EventManager::Manager::processConnections_() void EventManager::Manager::processConnections_()
{ {
std::lock_guard<std::mutex> guard(mutexParticipants_); std::lock_guard<std::mutex> guard(mutexParticipants_);
@ -352,13 +349,33 @@
{ {
std::shared_ptr<EventManager::Participant> participant = connectionQueue_.front(); std::shared_ptr<EventManager::Participant> participant = connectionQueue_.front();
connectionQueue_.pop(); connectionQueue_.pop();
particpants_.push_back(participant); participants_.push_back(participant);
participant->init(); participant->init();
} }
} }
void EventManager::Manager::processDisableScheduling_()
{
std::lock_guard<std::mutex> guard( mutexDisableScheduleQueue_ );
while( disableScheduleQueue_.empty() != true )
{
std::shared_ptr<EventManager::Participant> participant = disableScheduleQueue_.front();
disableScheduleQueue_.pop();
std::unique_lock<std::mutex> lk(mutexSchedulingParticipants_);
auto it = std::find(schedulingParticipants_.begin(), schedulingParticipants_.end(), participant);
if (it != schedulingParticipants_.end())
{
schedulingParticipants_.erase(it);
}
lk.unlock();
}
}
void EventManager::Manager::connect(std::shared_ptr<EventManager::Participant> participant) void EventManager::Manager::connect(std::shared_ptr<EventManager::Participant> participant)
{ {
std::lock_guard<std::mutex> guard(mutexParticipants_); std::lock_guard<std::mutex> guard(mutexParticipants_);
@ -375,20 +392,17 @@
void EventManager::Manager::disconnect(std::shared_ptr<EventManager::Participant> participant) void EventManager::Manager::disconnect(std::shared_ptr<EventManager::Participant> participant)
{ {
disconnect(participant); disconnect(participant);
std::lock_guard<std::mutex> guard(mutexParticipants_); std::lock_guard<std::mutex> guard(mutexParticipants_);
std::list<std::shared_ptr<EventManager::Participant>>::iterator it; std::list<std::shared_ptr<EventManager::Participant>>::iterator it;
it = std::find(particpants_.begin(), particpants_.end(),participant); it = std::find(participants_.begin(), participants_.end(),participant);
if (it != particpants_.end()) if (it != participants_.end())
{ {
particpants_.erase(it); participants_.erase(it);
} }
participant->setManager(nullptr); participant->setManager(nullptr);
} }