Skip to content

Commit fbb6577

Browse files
rbxdennisklein
authored andcommittedNov 10, 2023
StateMachine: Guard access to subscription containers
1 parent 6122010 commit fbb6577

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed
 

‎fairmq/StateMachine.cxx

+9-2
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ struct Machine_ : public state_machine_def<Machine_>
177177
atomic<bool> fLastTransitionResult;
178178

179179
mutex fStateMtx;
180+
mutex fSubscriptionsMtx;
180181
atomic<bool> fNewStatePending;
181182
condition_variable fNewStatePendingCV;
182183

@@ -312,12 +313,15 @@ void StateMachine::SubscribeToStateChange(const string& key, function<void(const
312313
{
313314
// Check if the key has a integer value as prefix, if yes, decode it.
314315
int i = strtol(key.c_str(), nullptr, 10);
315-
static_pointer_cast<FairMQFSM>(fFsm)->fStateChangeSignalsMap.insert({key, static_pointer_cast<FairMQFSM>(fFsm)->fStateChangeSignal.connect(i, callback)});
316+
auto fsm = static_pointer_cast<FairMQFSM>(fFsm);
317+
lock_guard<mutex> lock(fsm->fSubscriptionsMtx);
318+
fsm->fStateChangeSignalsMap.insert({key, fsm->fStateChangeSignal.connect(i, callback)});
316319
}
317320

318321
void StateMachine::UnsubscribeFromStateChange(const string& key)
319322
{
320323
auto fsm = static_pointer_cast<FairMQFSM>(fFsm);
324+
lock_guard<mutex> lock(fsm->fSubscriptionsMtx);
321325
if (fsm->fStateChangeSignalsMap.count(key)) {
322326
fsm->fStateChangeSignalsMap.at(key).disconnect();
323327
fsm->fStateChangeSignalsMap.erase(key);
@@ -357,12 +361,15 @@ void StateMachine::StopHandlingStates()
357361

358362
void StateMachine::SubscribeToNewTransition(const string& key, function<void(const Transition)> callback)
359363
{
360-
static_pointer_cast<FairMQFSM>(fFsm)->fNewTransitionSignalsMap.insert({key, static_pointer_cast<FairMQFSM>(fFsm)->fNewTransitionSignal.connect(callback)});
364+
auto fsm = static_pointer_cast<FairMQFSM>(fFsm);
365+
lock_guard<mutex> lock(fsm->fSubscriptionsMtx);
366+
fsm->fNewTransitionSignalsMap.insert({key, fsm->fNewTransitionSignal.connect(callback)});
361367
}
362368

363369
void StateMachine::UnsubscribeFromNewTransition(const string& key)
364370
{
365371
auto fsm = static_pointer_cast<FairMQFSM>(fFsm);
372+
lock_guard<mutex> lock(fsm->fSubscriptionsMtx);
366373
if (fsm->fNewTransitionSignalsMap.count(key)) {
367374
fsm->fNewTransitionSignalsMap.at(key).disconnect();
368375
fsm->fNewTransitionSignalsMap.erase(key);

0 commit comments

Comments
 (0)
Please sign in to comment.