Skip to content

Commit f5179a7

Browse files
authored
Merge pull request #59 from ebertin/fix/progress_race
Guard progress observers with a mutex
2 parents b8794ab + 10cf599 commit f5179a7

File tree

2 files changed

+7
-0
lines changed

2 files changed

+7
-0
lines changed

SEMain/SEMain/ProgressMediator.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "SEFramework/Pipeline/Segmentation.h"
1313
#include "SEUtils/Observable.h"
1414
#include <atomic>
15+
#include <mutex>
1516

1617
namespace SExtractor {
1718

@@ -75,6 +76,10 @@ class ProgressMediator: public ProgressObservable, public DoneObservable {
7576
std::shared_ptr<source_observer_t> m_detection_listener;
7677
std::shared_ptr<group_observer_t> m_deblending_listener, m_measurement_listener;
7778

79+
// Mediator serializes the notifications, so the observers do not need to worry about
80+
// being called from multiple threads
81+
std::mutex m_mutex;
82+
7883
// This is a set of internal classes that implement the Observer pattern for different stages.
7984
class ProgressCounter;
8085
class SourceCounter;

SEMain/src/lib/ProgressMediator.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ std::shared_ptr<ProgressMediator::group_observer_t>& ProgressMediator::getMeasur
8282
}
8383

8484
void ProgressMediator::update(void) {
85+
std::lock_guard<std::mutex> guard(m_mutex);
8586
this->ProgressObservable::notifyObservers(std::map<std::string, std::pair<int, int>>{
8687
{"Detected", {m_detected, -1}},
8788
{"Deblended", {m_deblended, -1}},
@@ -91,6 +92,7 @@ void ProgressMediator::update(void) {
9192
}
9293

9394
void ProgressMediator::done() {
95+
std::lock_guard<std::mutex> guard(m_mutex);
9496
this->DoneObservable::notifyObservers(true);
9597
}
9698

0 commit comments

Comments
 (0)