From d93dc2f7f7ed9c06a671df8e5a0991d8c4f83356 Mon Sep 17 00:00:00 2001 From: Alexey Rybalchenko Date: Fri, 4 May 2018 16:12:37 +0200 Subject: [PATCH] Use enum transport types instead of strings in Channel/Device --- fairmq/FairMQChannel.cxx | 24 ++++++------------------ fairmq/FairMQChannel.h | 3 +-- fairmq/FairMQDevice.cxx | 39 ++++++++++++++++++++++++--------------- fairmq/FairMQDevice.h | 12 ++++++------ fairmq/Transports.h | 16 ++++++++-------- 5 files changed, 45 insertions(+), 49 deletions(-) diff --git a/fairmq/FairMQChannel.cxx b/fairmq/FairMQChannel.cxx index 82721f45..25a1fe26 100644 --- a/fairmq/FairMQChannel.cxx +++ b/fairmq/FairMQChannel.cxx @@ -28,7 +28,6 @@ FairMQChannel::FairMQChannel() , fType("unspecified") , fMethod("unspecified") , fAddress("unspecified") - , fTransportName("default") , fSndBufSize(1000) , fRcvBufSize(1000) , fSndKernelSize(0) @@ -49,7 +48,6 @@ FairMQChannel::FairMQChannel(const string& type, const string& method, const str , fType(type) , fMethod(method) , fAddress(address) - , fTransportName("default") , fSndBufSize(1000) , fRcvBufSize(1000) , fSndKernelSize(0) @@ -70,7 +68,6 @@ FairMQChannel::FairMQChannel(const string& name, const string& type, std::shared , fType(type) , fMethod("unspecified") , fAddress("unspecified") - , fTransportName("default") // TODO refactor, either use string representation or enum type , fSndBufSize(1000) , fRcvBufSize(1000) , fSndKernelSize(0) @@ -91,7 +88,6 @@ FairMQChannel::FairMQChannel(const FairMQChannel& chan) , fType(chan.fType) , fMethod(chan.fMethod) , fAddress(chan.fAddress) - , fTransportName(chan.fTransportName) , fSndBufSize(chan.fSndBufSize) , fRcvBufSize(chan.fRcvBufSize) , fSndKernelSize(chan.fSndKernelSize) @@ -99,7 +95,7 @@ FairMQChannel::FairMQChannel(const FairMQChannel& chan) , fRateLogging(chan.fRateLogging) , fName(chan.fName) , fIsValid(false) - , fTransportType(fair::mq::Transport::DEFAULT) + , fTransportType(chan.fTransportType) , fTransportFactory(nullptr) , fMultipart(chan.fMultipart) , fModified(chan.fModified) @@ -111,7 +107,6 @@ FairMQChannel& FairMQChannel::operator=(const FairMQChannel& chan) fType = chan.fType; fMethod = chan.fMethod; fAddress = chan.fAddress; - fTransportName = chan.fTransportName; fSndBufSize = chan.fSndBufSize; fRcvBufSize = chan.fRcvBufSize; fSndKernelSize = chan.fSndKernelSize; @@ -120,7 +115,7 @@ FairMQChannel& FairMQChannel::operator=(const FairMQChannel& chan) fSocket = nullptr; fName = chan.fName; fIsValid = false; - fTransportType = fair::mq::Transport::DEFAULT; + fTransportType = chan.fTransportType; fTransportFactory = nullptr; return *this; @@ -199,7 +194,7 @@ string FairMQChannel::GetTransportName() const try { unique_lock lock(fChannelMutex); - return fTransportName; + return fair::mq::TransportNames.at(fTransportType); } catch (exception& e) { @@ -332,7 +327,9 @@ void FairMQChannel::UpdateTransport(const string& transport) { unique_lock lock(fChannelMutex); fIsValid = false; - fTransportName = transport; + LOG(WARN) << fName << ": " << transport; + fTransportType = fair::mq::TransportTypes.at(transport); + LOG(WARN) << fName << ": " << fair::mq::TransportNames.at(fTransportType); fModified = true; } catch (exception& e) @@ -586,15 +583,6 @@ bool FairMQChannel::ValidateChannel() } } - // validate channel transport - if (fair::mq::TransportTypes.find(fTransportName) == fair::mq::TransportTypes.end()) - { - ss << "INVALID"; - LOG(debug) << ss.str(); - LOG(error) << "Invalid channel transport: \"" << fTransportName << "\""; - exit(EXIT_FAILURE); - } - // validate socket buffer size for sending if (fSndBufSize < 0) { diff --git a/fairmq/FairMQChannel.h b/fairmq/FairMQChannel.h index 5d91d2ef..66f77b18 100644 --- a/fairmq/FairMQChannel.h +++ b/fairmq/FairMQChannel.h @@ -301,7 +301,7 @@ class FairMQChannel std::string fType; std::string fMethod; std::string fAddress; - std::string fTransportName; + fair::mq::Transport fTransportType; int fSndBufSize; int fRcvBufSize; int fSndKernelSize; @@ -311,7 +311,6 @@ class FairMQChannel std::string fName; std::atomic fIsValid; - fair::mq::Transport fTransportType; std::shared_ptr fTransportFactory; bool CheckCompatibility(std::unique_ptr& msg) const; diff --git a/fairmq/FairMQDevice.cxx b/fairmq/FairMQDevice.cxx index 880653b6..cc7f4e4e 100644 --- a/fairmq/FairMQDevice.cxx +++ b/fairmq/FairMQDevice.cxx @@ -29,6 +29,7 @@ using namespace std; + FairMQDevice::FairMQDevice() : fTransportFactory(nullptr) , fTransports() @@ -42,7 +43,7 @@ FairMQDevice::FairMQDevice() , fPortRangeMin(22000) , fPortRangeMax(32000) , fNetworkInterface() - , fDefaultTransportName("default") + , fDefaultTransportType(fair::mq::Transport::DEFAULT) , fInitializationTimeoutInS(120) , fDataCallbacks(false) , fMsgInputs() @@ -72,7 +73,7 @@ FairMQDevice::FairMQDevice(const fair::mq::tools::Version version) , fPortRangeMin(22000) , fPortRangeMax(32000) , fNetworkInterface() - , fDefaultTransportName("default") + , fDefaultTransportType(fair::mq::Transport::DEFAULT) , fInitializationTimeoutInS(120) , fDataCallbacks(false) , fMsgInputs() @@ -246,15 +247,15 @@ bool FairMQDevice::AttachChannel(FairMQChannel& ch) { if (!ch.fTransportFactory) { - if (ch.fTransportName == "default" || ch.fTransportName == fDefaultTransportName) + if (ch.fTransportType == fair::mq::Transport::DEFAULT || ch.fTransportType == fTransportFactory->GetType()) { LOG(debug) << ch.fName << ": using default transport"; ch.InitTransport(fTransportFactory); } else { - LOG(debug) << ch.fName << ": channel transport (" << fDefaultTransportName << ") overriden to " << ch.fTransportName; - ch.InitTransport(AddTransport(ch.fTransportName)); + LOG(debug) << ch.fName << ": channel transport (" << fair::mq::TransportNames.at(fDefaultTransportType) << ") overriden to " << fair::mq::TransportNames.at(ch.fTransportType); + ch.InitTransport(AddTransport(ch.fTransportType)); } ch.fTransportType = ch.fTransportFactory->GetType(); } @@ -760,24 +761,24 @@ void FairMQDevice::Pause() LOG(debug) << "Unpausing"; } -shared_ptr FairMQDevice::AddTransport(const string& transport) +shared_ptr FairMQDevice::AddTransport(const fair::mq::Transport transport) { - auto i = fTransports.find(fair::mq::TransportTypes.at(transport)); + auto i = fTransports.find(transport); if (i == fTransports.end()) { - auto tr = FairMQTransportFactory::CreateTransportFactory(transport, fId, fConfig); + auto tr = FairMQTransportFactory::CreateTransportFactory(fair::mq::TransportNames.at(transport), fId, fConfig); - LOG(debug) << "Adding '" << transport << "' transport to the device."; + LOG(debug) << "Adding '" << fair::mq::TransportNames.at(transport) << "' transport to the device."; - pair> trPair(fair::mq::TransportTypes.at(transport), tr); + pair> trPair(transport, tr); fTransports.insert(trPair); return tr; } else { - LOG(debug) << "Reusing existing '" << transport << "' transport."; + LOG(debug) << "Reusing existing '" << fair::mq::TransportNames.at(transport) << "' transport."; return i->second; } } @@ -804,7 +805,11 @@ void FairMQDevice::CreateOwnConfig() fNumIoThreads = fConfig->GetValue("io-threads"); fInitializationTimeoutInS = fConfig->GetValue("initialization-timeout"); fRate = fConfig->GetValue("rate"); - fDefaultTransportName = fConfig->GetValue("transport"); + try { + fDefaultTransportType = fair::mq::TransportTypes.at(fConfig->GetValue("transport")); + } catch(const exception& e) { + LOG(ERROR) << "invalid transport type provided: " << fConfig->GetValue("transport"); + } } void FairMQDevice::SetTransport(const string& transport) @@ -819,7 +824,7 @@ void FairMQDevice::SetTransport(const string& transport) if (fTransports.empty()) { LOG(debug) << "Requesting '" << transport << "' as default transport for the device"; - fTransportFactory = AddTransport(transport); + fTransportFactory = AddTransport(fair::mq::TransportTypes.at(transport)); } else { @@ -844,8 +849,12 @@ void FairMQDevice::SetConfig(FairMQProgOptions& config) fNumIoThreads = config.GetValue("io-threads"); fInitializationTimeoutInS = config.GetValue("initialization-timeout"); fRate = fConfig->GetValue("rate"); - fDefaultTransportName = config.GetValue("transport"); - SetTransport(fDefaultTransportName); + try { + fDefaultTransportType = fair::mq::TransportTypes.at(fConfig->GetValue("transport")); + } catch(const exception& e) { + LOG(ERROR) << "invalid transport type provided: " << fConfig->GetValue("transport"); + } + SetTransport(fConfig->GetValue("transport")); } void FairMQDevice::LogSocketRates() diff --git a/fairmq/FairMQDevice.h b/fairmq/FairMQDevice.h index 3111cb96..06bafb38 100644 --- a/fairmq/FairMQDevice.h +++ b/fairmq/FairMQDevice.h @@ -196,7 +196,7 @@ class FairMQDevice : public FairMQStateMachine /// @brief Getter for default transport factory auto Transport() const -> const FairMQTransportFactory* { - return fTransportFactory.get();; + return fTransportFactory.get(); } template @@ -293,7 +293,7 @@ class FairMQDevice : public FairMQStateMachine /// Adds a transport to the device if it doesn't exist /// @param transport Transport string ("zeromq"/"nanomsg"/"shmem") - std::shared_ptr AddTransport(const std::string& transport); + std::shared_ptr AddTransport(const fair::mq::Transport transport); /// Sets the default transport for the device /// @param transport Transport string ("zeromq"/"nanomsg"/"shmem") void SetTransport(const std::string& transport = "zeromq"); @@ -407,14 +407,14 @@ class FairMQDevice : public FairMQStateMachine void SetNetworkInterface(const std::string& networkInterface) { fNetworkInterface = networkInterface; } std::string GetNetworkInterface() const { return fNetworkInterface; } - void SetDefaultTransportName(const std::string& defaultTransportName) { fDefaultTransportName = defaultTransportName; } - std::string GetDefaultTransportName() const { return fDefaultTransportName; } + void SetDefaultTransport(const std::string& name) { fDefaultTransportType = fair::mq::TransportTypes.at(name); } + std::string GetDefaultTransport() const { return fair::mq::TransportNames.at(fDefaultTransportType); } void SetInitializationTimeoutInS(int initializationTimeoutInS) { fInitializationTimeoutInS = initializationTimeoutInS; } int GetInitializationTimeoutInS() const { return fInitializationTimeoutInS; } protected: - std::shared_ptr fTransportFactory; ///< Transport factory + std::shared_ptr fTransportFactory; ///< Default transport factory std::unordered_map> fTransports; ///< Container for transports public: @@ -472,7 +472,7 @@ class FairMQDevice : public FairMQStateMachine int fPortRangeMax; ///< Maximum value for the port range (if dynamic) std::string fNetworkInterface; ///< Network interface to use for dynamic binding - std::string fDefaultTransportName; ///< Default transport for the device + fair::mq::Transport fDefaultTransportType; ///< Default transport for the device int fInitializationTimeoutInS; ///< Timeout for the initialization (in seconds) diff --git a/fairmq/Transports.h b/fairmq/Transports.h index 2f525bed..db6dfcb5 100644 --- a/fairmq/Transports.h +++ b/fairmq/Transports.h @@ -29,14 +29,6 @@ enum class Transport OFI }; -static std::unordered_map TransportTypes { - { "default", Transport::DEFAULT }, - { "zeromq", Transport::ZMQ }, - { "nanomsg", Transport::NN }, - { "shmem", Transport::SHM }, - { "ofi", Transport::OFI } -}; - } /* namespace mq */ } /* namespace fair */ @@ -53,6 +45,14 @@ namespace fair namespace mq { +static std::unordered_map TransportTypes { + { "default", Transport::DEFAULT }, + { "zeromq", Transport::ZMQ }, + { "nanomsg", Transport::NN }, + { "shmem", Transport::SHM }, + { "ofi", Transport::OFI } +}; + static std::unordered_map TransportNames { { Transport::DEFAULT, "default" }, { Transport::ZMQ, "zeromq" },