@@ -177,6 +177,7 @@ struct Machine_ : public state_machine_def<Machine_>
177
177
atomic<bool > fLastTransitionResult ;
178
178
179
179
mutex fStateMtx ;
180
+ mutex fSubscriptionsMtx ;
180
181
atomic<bool > fNewStatePending ;
181
182
condition_variable fNewStatePendingCV ;
182
183
@@ -312,12 +313,15 @@ void StateMachine::SubscribeToStateChange(const string& key, function<void(const
312
313
{
313
314
// Check if the key has a integer value as prefix, if yes, decode it.
314
315
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)});
316
319
}
317
320
318
321
void StateMachine::UnsubscribeFromStateChange (const string& key)
319
322
{
320
323
auto fsm = static_pointer_cast<FairMQFSM>(fFsm );
324
+ lock_guard<mutex> lock (fsm->fSubscriptionsMtx );
321
325
if (fsm->fStateChangeSignalsMap .count (key)) {
322
326
fsm->fStateChangeSignalsMap .at (key).disconnect ();
323
327
fsm->fStateChangeSignalsMap .erase (key);
@@ -357,12 +361,15 @@ void StateMachine::StopHandlingStates()
357
361
358
362
void StateMachine::SubscribeToNewTransition (const string& key, function<void (const Transition)> callback)
359
363
{
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)});
361
367
}
362
368
363
369
void StateMachine::UnsubscribeFromNewTransition (const string& key)
364
370
{
365
371
auto fsm = static_pointer_cast<FairMQFSM>(fFsm );
372
+ lock_guard<mutex> lock (fsm->fSubscriptionsMtx );
366
373
if (fsm->fNewTransitionSignalsMap .count (key)) {
367
374
fsm->fNewTransitionSignalsMap .at (key).disconnect ();
368
375
fsm->fNewTransitionSignalsMap .erase (key);
0 commit comments