mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-13 08:41:16 +00:00
Allow plugins to create channels
This also fixes a bug, that prevented the usage of custom types with the plugin config API.
This commit is contained in:
parent
3b5b2b501f
commit
5e4876c947
|
@ -397,7 +397,11 @@ class FairMQDevice : public FairMQStateMachine
|
||||||
void SetRawCmdLineArgs(const std::vector<std::string>& args) { fRawCmdLineArgs = args; }
|
void SetRawCmdLineArgs(const std::vector<std::string>& args) { fRawCmdLineArgs = args; }
|
||||||
std::vector<std::string> GetRawCmdLineArgs() const { return fRawCmdLineArgs; }
|
std::vector<std::string> GetRawCmdLineArgs() const { return fRawCmdLineArgs; }
|
||||||
|
|
||||||
void RunStateMachine() { ProcessWork(); };
|
void RunStateMachine()
|
||||||
|
{
|
||||||
|
CallStateChangeCallbacks(FairMQStateMachine::IDLE);
|
||||||
|
ProcessWork();
|
||||||
|
};
|
||||||
|
|
||||||
/// Wait for the supplied amount of time or for interruption.
|
/// Wait for the supplied amount of time or for interruption.
|
||||||
/// If interrupted, returns false, otherwise true.
|
/// If interrupted, returns false, otherwise true.
|
||||||
|
|
|
@ -175,12 +175,13 @@ struct Machine_ : public state_machine_def<Machine_>
|
||||||
using initial_state = boost::mpl::vector<IDLE_FSM_STATE, OK_FSM_STATE>;
|
using initial_state = boost::mpl::vector<IDLE_FSM_STATE, OK_FSM_STATE>;
|
||||||
|
|
||||||
template<typename Event, typename FSM>
|
template<typename Event, typename FSM>
|
||||||
void on_entry(Event const&, FSM& fsm)
|
void on_entry(Event const&, FSM& /*fsm*/)
|
||||||
{
|
{
|
||||||
LOG(state) << "Starting FairMQ state machine";
|
LOG(state) << "Starting FairMQ state machine";
|
||||||
fState = FairMQStateMachine::IDLE;
|
fState = FairMQStateMachine::IDLE;
|
||||||
LOG(state) << "Entering IDLE state";
|
LOG(state) << "Entering IDLE state";
|
||||||
fsm.CallStateChangeCallbacks(FairMQStateMachine::IDLE);
|
// fsm.CallStateChangeCallbacks(FairMQStateMachine::IDLE);
|
||||||
|
// we call this for now in FairMQDevice::RunStateMachine()
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Event, typename FSM>
|
template<typename Event, typename FSM>
|
||||||
|
|
|
@ -186,13 +186,16 @@ class PluginServices
|
||||||
auto SetProperty(const std::string& key, T val) -> void
|
auto SetProperty(const std::string& key, T val) -> void
|
||||||
{
|
{
|
||||||
auto currentState = GetCurrentDeviceState();
|
auto currentState = GetCurrentDeviceState();
|
||||||
if (currentState == DeviceState::InitializingDevice)
|
if ( (currentState == DeviceState::InitializingDevice)
|
||||||
|
|| ((currentState == DeviceState::Idle) && (key == "channel-config")))
|
||||||
{
|
{
|
||||||
fConfig.SetValue(key, val);
|
fConfig.SetValue(key, val);
|
||||||
}
|
}
|
||||||
else
|
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; };
|
struct InvalidStateError : std::runtime_error { using std::runtime_error::runtime_error; };
|
||||||
|
|
|
@ -162,7 +162,7 @@ int FairMQProgOptions::ParseAll(const int argc, char const* const* argv, bool al
|
||||||
else if (fVarMap.count("channel-config"))
|
else if (fVarMap.count("channel-config"))
|
||||||
{
|
{
|
||||||
LOG(debug) << "channel-config: Parsing channel configuration";
|
LOG(debug) << "channel-config: Parsing channel configuration";
|
||||||
UpdateChannelMap(parser::SUBOPT().UserParser(fVarMap.at("channel-config").as<vector<string>>(), idForParser));
|
ParseChannelsFromCmdLine();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -185,6 +185,23 @@ int FairMQProgOptions::ParseAll(const int argc, char const* const* argv, bool al
|
||||||
return 0;
|
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<string>();
|
||||||
|
}
|
||||||
|
else if (fVarMap.count("id"))
|
||||||
|
{
|
||||||
|
idForParser = fVarMap["id"].as<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateChannelMap(parser::SUBOPT().UserParser(fVarMap.at("channel-config").as<vector<string>>(), idForParser));
|
||||||
|
}
|
||||||
|
|
||||||
void FairMQProgOptions::ParseCmdLine(const int argc, char const* const* argv, bool allowUnregistered)
|
void FairMQProgOptions::ParseCmdLine(const int argc, char const* const* argv, bool allowUnregistered)
|
||||||
{
|
{
|
||||||
fVarMap.clear();
|
fVarMap.clear();
|
||||||
|
|
|
@ -59,14 +59,14 @@ class FairMQProgOptions
|
||||||
// update variable map
|
// update variable map
|
||||||
UpdateVarMap<typename std::decay<T>::type>(key, val);
|
UpdateVarMap<typename std::decay<T>::type>(key, val);
|
||||||
|
|
||||||
// update FairMQChannel map if the key is a channel key
|
if (key == "channel-config")
|
||||||
if (std::is_same<T, int>::value || std::is_same<T, std::string>::value)
|
|
||||||
{
|
{
|
||||||
if (fChannelKeyMap.count(key))
|
ParseChannelsFromCmdLine();
|
||||||
|
}
|
||||||
|
else if (fChannelKeyMap.count(key))
|
||||||
{
|
{
|
||||||
UpdateChannelValue(fChannelKeyMap.at(key).channel, fChannelKeyMap.at(key).index, fChannelKeyMap.at(key).member, val);
|
UpdateChannelValue(fChannelKeyMap.at(key).channel, fChannelKeyMap.at(key).index, fChannelKeyMap.at(key).member, val);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
|
@ -210,6 +210,12 @@ class FairMQProgOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
int UpdateChannelMap(const FairMQChannelMap& map);
|
int UpdateChannelMap(const FairMQChannelMap& map);
|
||||||
|
template<typename T>
|
||||||
|
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, const std::string& val);
|
||||||
int UpdateChannelValue(const std::string& channelName, int index, const std::string& member, int 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);
|
vm[key].value() = boost::any(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParseChannelsFromCmdLine();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FAIRMQPROGOPTIONS_H */
|
#endif /* FAIRMQPROGOPTIONS_H */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user