diff --git a/fairmq/FairMQDevice.cxx b/fairmq/FairMQDevice.cxx index 76f44f02..1564ef95 100644 --- a/fairmq/FairMQDevice.cxx +++ b/fairmq/FairMQDevice.cxx @@ -21,6 +21,10 @@ #include // join/split +#include +#include +#include + #include "FairMQSocket.h" #include "FairMQDevice.h" #include "FairMQLogger.h" @@ -68,7 +72,9 @@ FairMQDevice::FairMQDevice() , fInputChannelKeys() , fMultitransportMutex() , fMultitransportProceed(false) + , fExternalConfig(false) { + LOG(DEBUG) << "PID: " << getpid(); } void FairMQDevice::CatchSignals() @@ -913,8 +919,38 @@ unique_ptr FairMQDevice::MakeTransport(const string& tra return move(tr); } +void FairMQDevice::CreateOwnConfig() +{ + // TODO: make fConfig a shared_ptr when no old user code has FairMQProgOptions ptr* + fConfig = new FairMQProgOptions(); + + string id{boost::uuids::to_string(boost::uuids::random_generator()())}; + LOG(WARN) << "No FairMQProgOptions provided, creating one internally and setting device ID to " << id; + + // dummy argc+argv + char arg0[] = "undefined"; // executable name + char arg1[] = "--id"; + char* arg2 = const_cast(id.c_str()); // device ID + char* argv[] = { &arg0[0], &arg1[0], arg2, nullptr }; + int argc = static_cast((sizeof(argv) / sizeof(argv[0])) - 1); + + fConfig->ParseAll(argc, &argv[0]); + + fId = fConfig->GetValue("id"); + fNetworkInterface = fConfig->GetValue("network-interface"); + fNumIoThreads = fConfig->GetValue("io-threads"); + fInitializationTimeoutInS = fConfig->GetValue("initialization-timeout"); +} + void FairMQDevice::SetTransport(const string& transport) { + // This method is the first to be called, if FairMQProgOptions are not used (either SetTransport() or SetConfig() make sense, not both). + // Make sure here that at least internal config is available. + if (!fExternalConfig && !fConfig) + { + CreateOwnConfig(); + } + if (fTransports.empty()) { LOG(DEBUG) << "Requesting '" << transport << "' as default transport for the device"; @@ -929,7 +965,7 @@ void FairMQDevice::SetTransport(const string& transport) void FairMQDevice::SetConfig(FairMQProgOptions& config) { - LOG(DEBUG) << "PID: " << getpid(); + fExternalConfig = true; fConfig = &config; fChannels = config.GetFairMQMap(); fDefaultTransport = config.GetValue("transport"); @@ -1209,6 +1245,11 @@ const FairMQChannel& FairMQDevice::GetChannel(const std::string& channelName, co void FairMQDevice::Exit() { LOG(DEBUG) << "All transports are shut down."; + + if (!fExternalConfig && fConfig) + { + delete fConfig; + } } FairMQDevice::~FairMQDevice() diff --git a/fairmq/FairMQDevice.h b/fairmq/FairMQDevice.h index bff6636c..0a429ec4 100644 --- a/fairmq/FairMQDevice.h +++ b/fairmq/FairMQDevice.h @@ -472,6 +472,8 @@ class FairMQDevice : public FairMQStateMachine, public FairMQConfigurable bool HandleMsgInput(const std::string& chName, const InputMsgCallback& callback, int i) const; bool HandleMultipartInput(const std::string& chName, const InputMultipartCallback& callback, int i) const; + void CreateOwnConfig(); + /// Signal handler void SignalHandler(int signal); bool fCatchingSignals; @@ -486,6 +488,8 @@ class FairMQDevice : public FairMQStateMachine, public FairMQConfigurable std::vector fInputChannelKeys; std::mutex fMultitransportMutex; std::atomic fMultitransportProceed; + + bool fExternalConfig; }; #endif /* FAIRMQDEVICE_H_ */ diff --git a/fairmq/options/FairMQProgOptions.cxx b/fairmq/options/FairMQProgOptions.cxx index 3b043b58..eba64648 100644 --- a/fairmq/options/FairMQProgOptions.cxx +++ b/fairmq/options/FairMQProgOptions.cxx @@ -110,14 +110,12 @@ void FairMQProgOptions::ParseAll(const int argc, char** argv, bool allowUnregist if (!optionExists) { - LOG(WARN) << "Options to configure FairMQ channels are not provided."; - LOG(WARN) << "Please provide the value for one of the following keys:"; + LOG(WARN) << "FairMQProgOptions: no channels configuration provided via neither of:"; for (const auto& p : MQParserKeys) { - LOG(WARN) << p; + LOG(WARN) << " --" << p; } LOG(WARN) << "No channels will be created (You can create them manually)."; - // return 1; } else {