diff --git a/fairmq/FairMQDevice.h b/fairmq/FairMQDevice.h index 5b237b1c..771d9c79 100644 --- a/fairmq/FairMQDevice.h +++ b/fairmq/FairMQDevice.h @@ -397,7 +397,11 @@ class FairMQDevice : public FairMQStateMachine void SetRawCmdLineArgs(const std::vector& args) { fRawCmdLineArgs = args; } std::vector GetRawCmdLineArgs() const { return fRawCmdLineArgs; } - void RunStateMachine() { ProcessWork(); }; + void RunStateMachine() + { + CallStateChangeCallbacks(FairMQStateMachine::IDLE); + ProcessWork(); + }; /// Wait for the supplied amount of time or for interruption. /// If interrupted, returns false, otherwise true. diff --git a/fairmq/FairMQStateMachine.cxx b/fairmq/FairMQStateMachine.cxx index 4c43bf95..5b745794 100644 --- a/fairmq/FairMQStateMachine.cxx +++ b/fairmq/FairMQStateMachine.cxx @@ -175,12 +175,13 @@ struct Machine_ : public state_machine_def using initial_state = boost::mpl::vector; template - void on_entry(Event const&, FSM& fsm) + void on_entry(Event const&, FSM& /*fsm*/) { LOG(state) << "Starting FairMQ state machine"; fState = FairMQStateMachine::IDLE; LOG(state) << "Entering IDLE state"; - fsm.CallStateChangeCallbacks(FairMQStateMachine::IDLE); + // fsm.CallStateChangeCallbacks(FairMQStateMachine::IDLE); + // we call this for now in FairMQDevice::RunStateMachine() } template diff --git a/fairmq/PluginServices.h b/fairmq/PluginServices.h index dee322c0..d2f2d438 100644 --- a/fairmq/PluginServices.h +++ b/fairmq/PluginServices.h @@ -186,13 +186,16 @@ class PluginServices auto SetProperty(const std::string& key, T val) -> void { auto currentState = GetCurrentDeviceState(); - if (currentState == DeviceState::InitializingDevice) + if ( (currentState == DeviceState::InitializingDevice) + || ((currentState == DeviceState::Idle) && (key == "channel-config"))) { fConfig.SetValue(key, val); } else { - throw InvalidStateError{tools::ToString("PluginServices::SetProperty is not supported in device state ", currentState, ". Supported state is ", DeviceState::InitializingDevice, ".")}; + throw InvalidStateError{ + tools::ToString("PluginServices::SetProperty is not supported in device state ", currentState, ". ", + "Supported state is ", DeviceState::InitializingDevice, ".")}; } } struct InvalidStateError : std::runtime_error { using std::runtime_error::runtime_error; }; diff --git a/fairmq/options/FairMQProgOptions.cxx b/fairmq/options/FairMQProgOptions.cxx index 20ad8600..5f4b00ad 100644 --- a/fairmq/options/FairMQProgOptions.cxx +++ b/fairmq/options/FairMQProgOptions.cxx @@ -162,7 +162,7 @@ int FairMQProgOptions::ParseAll(const int argc, char const* const* argv, bool al else if (fVarMap.count("channel-config")) { LOG(debug) << "channel-config: Parsing channel configuration"; - UpdateChannelMap(parser::SUBOPT().UserParser(fVarMap.at("channel-config").as>(), idForParser)); + ParseChannelsFromCmdLine(); } else { @@ -185,6 +185,23 @@ int FairMQProgOptions::ParseAll(const int argc, char const* const* argv, bool al return 0; } +void FairMQProgOptions::ParseChannelsFromCmdLine() +{ + string idForParser; + + // check if config-key for config parser is provided + if (fVarMap.count("config-key")) + { + idForParser = fVarMap["config-key"].as(); + } + else if (fVarMap.count("id")) + { + idForParser = fVarMap["id"].as(); + } + + UpdateChannelMap(parser::SUBOPT().UserParser(fVarMap.at("channel-config").as>(), idForParser)); +} + void FairMQProgOptions::ParseCmdLine(const int argc, char const* const* argv, bool allowUnregistered) { fVarMap.clear(); diff --git a/fairmq/options/FairMQProgOptions.h b/fairmq/options/FairMQProgOptions.h index 9eebf4e0..e01f1543 100644 --- a/fairmq/options/FairMQProgOptions.h +++ b/fairmq/options/FairMQProgOptions.h @@ -59,13 +59,13 @@ class FairMQProgOptions // update variable map UpdateVarMap::type>(key, val); - // update FairMQChannel map if the key is a channel key - if (std::is_same::value || std::is_same::value) + if (key == "channel-config") { - if (fChannelKeyMap.count(key)) - { - UpdateChannelValue(fChannelKeyMap.at(key).channel, fChannelKeyMap.at(key).index, fChannelKeyMap.at(key).member, val); - } + ParseChannelsFromCmdLine(); + } + else if (fChannelKeyMap.count(key)) + { + UpdateChannelValue(fChannelKeyMap.at(key).channel, fChannelKeyMap.at(key).index, fChannelKeyMap.at(key).member, val); } lock.unlock(); @@ -210,6 +210,12 @@ class FairMQProgOptions } int UpdateChannelMap(const FairMQChannelMap& map); + template + int UpdateChannelValue(const std::string&, int, const std::string&, T) + { + LOG(error) << "update of FairMQChannel map failed, because value type not supported"; + return 1; + } int UpdateChannelValue(const std::string& channelName, int index, const std::string& member, const std::string& val); int UpdateChannelValue(const std::string& channelName, int index, const std::string& member, int val); @@ -223,6 +229,7 @@ class FairMQProgOptions vm[key].value() = boost::any(val); } + void ParseChannelsFromCmdLine(); }; #endif /* FAIRMQPROGOPTIONS_H */