diff --git a/fairmq/Device.cxx b/fairmq/Device.cxx index 8008f4be..f8990749 100644 --- a/fairmq/Device.cxx +++ b/fairmq/Device.cxx @@ -650,6 +650,8 @@ bool Device::HandleMultipartInput(const string& chName, const InputMultipartCall shared_ptr Device::AddTransport(mq::Transport transport) { + lock_guard lock(fTransportMtx); + if (transport == mq::Transport::DEFAULT) { transport = fDefaultTransportType; } @@ -769,6 +771,7 @@ void Device::LogSocketRates() void Device::InterruptTransports() { + lock_guard lock(fTransportMtx); for (auto& [transportType, transport] : fTransports) { transport->Interrupt(); } @@ -776,6 +779,7 @@ void Device::InterruptTransports() void Device::ResumeTransports() { + lock_guard lock(fTransportMtx); for (auto& [transportType, transport] : fTransports) { transport->Resume(); } @@ -792,14 +796,17 @@ void Device::ResetTaskWrapper() void Device::ResetWrapper() { - for (auto& [transportType, transport] : fTransports) { - transport->Reset(); + { + lock_guard lock(fTransportMtx); + for (auto& [transportType, transport] : fTransports) { + transport->Reset(); + } + fTransports.clear(); } Reset(); fChannels.clear(); - fTransports.clear(); fTransportFactory.reset(); if (!NewStatePending()) { ChangeState(Transition::Auto); diff --git a/fairmq/Device.h b/fairmq/Device.h index 77b96f64..5ad114b6 100644 --- a/fairmq/Device.h +++ b/fairmq/Device.h @@ -637,6 +637,7 @@ class Device StateQueue fStateQueue; + std::mutex fTransportMtx; ///< guards access to transports container std::mutex fTransitionMtx; bool fTransitioning; };