Add support and test for concurrent TransitionTo

This commit is contained in:
Alexey Rybalchenko
2019-07-15 15:48:36 +02:00
committed by Dennis Klein
parent 74d301a16f
commit 5256e7c580
3 changed files with 73 additions and 1 deletions

View File

@@ -106,6 +106,11 @@ FairMQDevice::FairMQDevice(ProgOptions* config, const tools::Version version)
, fMaxRunRuntimeInS(DefaultMaxRunTime)
, fInitializationTimeoutInS(DefaultInitTimeout)
, fRawCmdLineArgs()
, fStates()
, fStatesMtx()
, fStatesCV()
, fTransitionMtx()
, fTransitioning(false)
{
SubscribeToNewTransition("device", [&](Transition transition) {
LOG(trace) << "device notified on new transition: " << transition;
@@ -187,6 +192,15 @@ void FairMQDevice::WaitForState(fair::mq::State state)
void FairMQDevice::TransitionTo(const fair::mq::State s)
{
{
lock_guard<mutex> lock(fTransitionMtx);
if (fTransitioning) {
LOG(debug) << "Attempting a transition with TransitionTo() while another one is already in progress";
throw OngoingTransition("Attempting a transition with TransitionTo() while another one is already in progress");
}
fTransitioning = true;
}
using fair::mq::State;
State currentState = GetCurrentState();
@@ -225,6 +239,11 @@ void FairMQDevice::TransitionTo(const fair::mq::State s)
currentState = WaitForNextState();
}
{
lock_guard<mutex> lock(fTransitionMtx);
fTransitioning = false;
}
}
bool FairMQDevice::ChangeState(const int transition)