diff --git a/fairmq/DeviceRunner.cxx b/fairmq/DeviceRunner.cxx index 3b06adf5..b39a09d0 100644 --- a/fairmq/DeviceRunner.cxx +++ b/fairmq/DeviceRunner.cxx @@ -13,9 +13,9 @@ using namespace fair::mq; DeviceRunner::DeviceRunner(int argc, char* const argv[]) - : fDevice(nullptr) - , fRawCmdLineArgs(tools::ToStrVector(argc, argv, false)) + : fRawCmdLineArgs(tools::ToStrVector(argc, argv, false)) , fConfig() + , fDevice(nullptr) , fPluginManager(fRawCmdLineArgs) , fEvents() {} @@ -83,7 +83,7 @@ auto DeviceRunner::Run() -> int fDevice->SetConfig(fConfig); // Initialize plugin services - fPluginManager.EmplacePluginServices(&fConfig, *fDevice); + fPluginManager.EmplacePluginServices(fConfig, *fDevice); // Instantiate and run plugins fPluginManager.InstantiatePlugins(); diff --git a/fairmq/DeviceRunner.h b/fairmq/DeviceRunner.h index 07bcee50..5afb8086 100644 --- a/fairmq/DeviceRunner.h +++ b/fairmq/DeviceRunner.h @@ -61,9 +61,9 @@ class DeviceRunner template auto RemoveHook() -> void { fEvents.Unsubscribe("runner"); } - std::unique_ptr fDevice; std::vector fRawCmdLineArgs; FairMQProgOptions fConfig; + std::unique_ptr fDevice; PluginManager fPluginManager; private: diff --git a/fairmq/Plugin.h b/fairmq/Plugin.h index 8bdffbb3..db4dc98a 100644 --- a/fairmq/Plugin.h +++ b/fairmq/Plugin.h @@ -116,9 +116,9 @@ class Plugin } /* namespace fair */ #define REGISTER_FAIRMQ_PLUGIN(KLASS, NAME, VERSION, MAINTAINER, HOMEPAGE, PROGOPTIONS) \ -static auto Make_##NAME##_Plugin(fair::mq::PluginServices* pluginServices) -> std::shared_ptr \ +static auto Make_##NAME##_Plugin(fair::mq::PluginServices* pluginServices) -> std::unique_ptr \ { \ - return std::make_shared(std::string{#NAME}, VERSION, std::string{MAINTAINER}, std::string{HOMEPAGE}, pluginServices); \ + return fair::mq::tools::make_unique(std::string{#NAME}, VERSION, std::string{MAINTAINER}, std::string{HOMEPAGE}, pluginServices); \ } \ BOOST_DLL_ALIAS(Make_##NAME##_Plugin, make_##NAME##_plugin) \ BOOST_DLL_ALIAS(PROGOPTIONS, get_##NAME##_plugin_progoptions) diff --git a/fairmq/PluginManager.h b/fairmq/PluginManager.h index 4fcda8fd..3a81699b 100644 --- a/fairmq/PluginManager.h +++ b/fairmq/PluginManager.h @@ -70,7 +70,6 @@ class PluginManager struct PluginInstantiationError : std::runtime_error { using std::runtime_error::runtime_error; }; static auto ProgramOptions() -> boost::program_options::options_description; - static auto MakeFromCommandLineOptions(const std::vector) -> PluginManager; struct ProgramOptionsParseError : std::runtime_error { using std::runtime_error::runtime_error; }; static auto LibPrefix() -> const std::string& { return fgkLibPrefix; } diff --git a/fairmq/PluginServices.h b/fairmq/PluginServices.h index 3cb77c45..7a27c034 100644 --- a/fairmq/PluginServices.h +++ b/fairmq/PluginServices.h @@ -38,7 +38,7 @@ class PluginServices { public: PluginServices() = delete; - PluginServices(FairMQProgOptions* config, FairMQDevice& device) + PluginServices(FairMQProgOptions& config, FairMQDevice& device) : fConfig(config) , fDevice(device) , fDeviceController() @@ -172,7 +172,7 @@ class PluginServices // Config API struct PropertyNotFoundError : std::runtime_error { using std::runtime_error::runtime_error; }; - auto PropertyExists(const std::string& key) const -> bool { return fConfig->Count(key) > 0; } + auto PropertyExists(const std::string& key) const -> bool { return fConfig.Count(key) > 0; } /// @brief Set config property /// @param key @@ -187,7 +187,7 @@ class PluginServices auto currentState = GetCurrentDeviceState(); if (currentState == DeviceState::InitializingDevice) { - fConfig->SetValue(key, val); + fConfig.SetValue(key, val); } else { @@ -205,7 +205,7 @@ class PluginServices template auto GetProperty(const std::string& key) const -> T { if (PropertyExists(key)) { - return fConfig->GetValue(key); + return fConfig.GetValue(key); } throw PropertyNotFoundError(fair::mq::tools::ToString("Config has no key: ", key)); } @@ -217,16 +217,16 @@ class PluginServices /// If a type is not supported, the user can provide support by overloading the ostream operator for this type auto GetPropertyAsString(const std::string& key) const -> std::string { if (PropertyExists(key)) { - return fConfig->GetStringValue(key); + return fConfig.GetStringValue(key); } throw PropertyNotFoundError(fair::mq::tools::ToString("Config has no key: ", key)); } - auto GetChannelInfo() const -> std::unordered_map { return fConfig->GetChannelInfo(); } + auto GetChannelInfo() const -> std::unordered_map { return fConfig.GetChannelInfo(); } /// @brief Discover the list of property keys /// @return list of property keys - auto GetPropertyKeys() const -> std::vector { return fConfig->GetPropertyKeys(); } + auto GetPropertyKeys() const -> std::vector { return fConfig.GetPropertyKeys(); } /// @brief Subscribe to property updates of type T /// @param subscriber @@ -236,13 +236,13 @@ class PluginServices template auto SubscribeToPropertyChange(const std::string& subscriber, std::function callback) const -> void { - fConfig->Subscribe(subscriber, callback); + fConfig.Subscribe(subscriber, callback); } /// @brief Unsubscribe from property updates of type T /// @param subscriber template - auto UnsubscribeFromPropertyChange(const std::string& subscriber) -> void { fConfig->Unsubscribe(subscriber); } + auto UnsubscribeFromPropertyChange(const std::string& subscriber) -> void { fConfig.Unsubscribe(subscriber); } /// @brief Subscribe to property updates /// @param subscriber @@ -251,12 +251,12 @@ class PluginServices /// Subscribe to property changes with a callback to monitor property changes in an event based fashion. Will convert the property to string. auto SubscribeToPropertyChangeAsString(const std::string& subscriber, std::function callback) const -> void { - fConfig->SubscribeAsString(subscriber, callback); + fConfig.SubscribeAsString(subscriber, callback); } /// @brief Unsubscribe from property updates that convert to string /// @param subscriber - auto UnsubscribeFromPropertyChangeAsString(const std::string& subscriber) -> void { fConfig->UnsubscribeAsString(subscriber); } + auto UnsubscribeFromPropertyChangeAsString(const std::string& subscriber) -> void { fConfig.UnsubscribeAsString(subscriber); } auto CycleLogConsoleSeverityUp() -> void { Logger::CycleConsoleSeverityUp(); } auto CycleLogConsoleSeverityDown() -> void { Logger::CycleConsoleSeverityDown(); } @@ -271,7 +271,7 @@ class PluginServices static const std::unordered_map> fkDeviceStateTransitionMap; private: - FairMQProgOptions* fConfig; // TODO make it a shared pointer, once old AliceO2 code is cleaned up + FairMQProgOptions& fConfig; FairMQDevice& fDevice; boost::optional fDeviceController; mutable std::mutex fDeviceControllerMutex; diff --git a/test/plugin_services/Fixture.h b/test/plugin_services/Fixture.h index 2c7e3993..db2f797f 100644 --- a/test/plugin_services/Fixture.h +++ b/test/plugin_services/Fixture.h @@ -23,39 +23,39 @@ namespace mq namespace test { -inline auto control(std::shared_ptr device) -> void +inline auto control(FairMQDevice& device) -> void { for (const auto event : { FairMQDevice::INIT_DEVICE, FairMQDevice::RESET_DEVICE, FairMQDevice::END, }) { - device->ChangeState(event); - if (event != FairMQDevice::END) device->WaitForEndOfState(event); + device.ChangeState(event); + if (event != FairMQDevice::END) device.WaitForEndOfState(event); } } struct PluginServices : ::testing::Test { PluginServices() : mConfig() - , mDevice{std::make_shared()} - , mServices{&mConfig, mDevice} + , mDevice() + , mServices(mConfig, mDevice) , fRunStateMachineThread() { - fRunStateMachineThread = std::thread(&FairMQDevice::RunStateMachine, mDevice.get()); - mDevice->SetTransport("zeromq"); + fRunStateMachineThread = std::thread(&FairMQDevice::RunStateMachine, &mDevice); + mDevice.SetTransport("zeromq"); } ~PluginServices() { - if (mDevice->GetCurrentState() == FairMQDevice::IDLE) control(mDevice); + if (mDevice.GetCurrentState() == FairMQDevice::IDLE) control(mDevice); if (fRunStateMachineThread.joinable()) { fRunStateMachineThread.join(); } } FairMQProgOptions mConfig; - std::shared_ptr mDevice; + FairMQDevice mDevice; fair::mq::PluginServices mServices; std::thread fRunStateMachineThread; }; diff --git a/test/plugin_services/_control.cxx b/test/plugin_services/_control.cxx index 306f906f..caeed251 100644 --- a/test/plugin_services/_control.cxx +++ b/test/plugin_services/_control.cxx @@ -39,9 +39,9 @@ TEST_F(PluginServices, OnlySingleController) EXPECT_EQ(mServices.GetDeviceController(), string{"foo"}); // park device - mDevice->WaitForEndOfState(FairMQDevice::DEVICE_READY); + mDevice.WaitForEndOfState(FairMQDevice::DEVICE_READY); mServices.ChangeDeviceState("foo", DeviceStateTransition::ResetDevice); - mDevice->WaitForEndOfState(FairMQDevice::RESET_DEVICE); + mDevice.WaitForEndOfState(FairMQDevice::RESET_DEVICE); mServices.ChangeDeviceState("foo", DeviceStateTransition::End); } @@ -72,7 +72,7 @@ TEST_F(PluginServices, Control) ASSERT_EQ(mServices.GetCurrentDeviceState(), DeviceState::DeviceReady); mServices.ChangeDeviceState("foo", DeviceStateTransition::ResetDevice); - mDevice->WaitForEndOfState(FairMQDevice::RESET_DEVICE); + mDevice.WaitForEndOfState(FairMQDevice::RESET_DEVICE); mServices.ChangeDeviceState("foo", DeviceStateTransition::End); } diff --git a/test/plugins/_plugin.cxx b/test/plugins/_plugin.cxx index 38ef88b7..5f2ce1e3 100644 --- a/test/plugins/_plugin.cxx +++ b/test/plugins/_plugin.cxx @@ -24,31 +24,31 @@ namespace using namespace std; using namespace fair::mq; -auto control(shared_ptr device) -> void +auto control(FairMQDevice& device) -> void { - device->SetTransport("zeromq"); + device.SetTransport("zeromq"); for (const auto event : { FairMQDevice::INIT_DEVICE, FairMQDevice::RESET_DEVICE, FairMQDevice::END, }) { - device->ChangeState(event); - if (event != FairMQDevice::END) device->WaitForEndOfState(event); + device.ChangeState(event); + if (event != FairMQDevice::END) device.WaitForEndOfState(event); } } TEST(Plugin, Operators) { FairMQProgOptions config; - auto device = make_shared(); - PluginServices services{&config, device}; + FairMQDevice device; + PluginServices services{config, device}; Plugin p1{"dds", {1, 0, 0}, "Foo Bar ", "https://git.test.net/dds.git", &services}; Plugin p2{"dds", {1, 0, 0}, "Foo Bar ", "https://git.test.net/dds.git", &services}; Plugin p3{"file", {1, 0, 0}, "Foo Bar ", "https://git.test.net/file.git", &services}; EXPECT_EQ(p1, p2); EXPECT_NE(p1, p3); - thread t(control, device); - device->RunStateMachine(); + thread t(control, std::ref(device)); + device.RunStateMachine(); if (t.joinable()) { t.join(); } @@ -57,14 +57,14 @@ TEST(Plugin, Operators) TEST(Plugin, OstreamOperators) { FairMQProgOptions config; - auto device = make_shared(); - PluginServices services{&config, device}; + FairMQDevice device; + PluginServices services{config, device}; Plugin p1{"dds", {1, 0, 0}, "Foo Bar ", "https://git.test.net/dds.git", &services}; stringstream ss; ss << p1; EXPECT_EQ(ss.str(), string{"'dds', version '1.0.0', maintainer 'Foo Bar ', homepage 'https://git.test.net/dds.git'"}); - thread t(control, device); - device->RunStateMachine(); + thread t(control, std::ref(device)); + device.RunStateMachine(); if (t.joinable()) { t.join(); } diff --git a/test/plugins/_plugin_manager.cxx b/test/plugins/_plugin_manager.cxx index 18afece2..75e6f8bc 100644 --- a/test/plugins/_plugin_manager.cxx +++ b/test/plugins/_plugin_manager.cxx @@ -25,25 +25,25 @@ using namespace boost::filesystem; using namespace boost::program_options; using namespace std; -auto control(shared_ptr device) -> void +auto control(FairMQDevice& device) -> void { - device->SetTransport("zeromq"); + device.SetTransport("zeromq"); for (const auto event : { FairMQDevice::INIT_DEVICE, FairMQDevice::RESET_DEVICE, FairMQDevice::END, }) { - device->ChangeState(event); - if (event != FairMQDevice::END) device->WaitForEndOfState(event); + device.ChangeState(event); + if (event != FairMQDevice::END) device.WaitForEndOfState(event); } } TEST(PluginManager, LoadPluginDynamic) { FairMQProgOptions config; + FairMQDevice device; PluginManager mgr; - auto device = make_shared(); - mgr.EmplacePluginServices(&config, device); + mgr.EmplacePluginServices(config, device); mgr.PrependSearchPath("./test"); @@ -63,8 +63,8 @@ TEST(PluginManager, LoadPluginDynamic) mgr.ForEachPluginProgOptions([&count](const options_description& /*d*/){ ++count; }); ASSERT_EQ(count, 1); - thread t(control, device); - device->RunStateMachine(); + thread t(control, std::ref(device)); + device.RunStateMachine(); if (t.joinable()) { t.join(); } @@ -72,16 +72,16 @@ TEST(PluginManager, LoadPluginDynamic) TEST(PluginManager, LoadPluginStatic) { + FairMQDevice device; PluginManager mgr; - auto device = make_shared(); - device->SetTransport("zeromq"); + device.SetTransport("zeromq"); ASSERT_NO_THROW(mgr.LoadPlugin("s:control")); FairMQProgOptions config; config.SetValue("control", "static"); config.SetValue("catch-signals", 0); - mgr.EmplacePluginServices(&config, device); + mgr.EmplacePluginServices(config, device); ASSERT_NO_THROW(mgr.InstantiatePlugins()); @@ -96,7 +96,7 @@ TEST(PluginManager, LoadPluginStatic) mgr.ForEachPluginProgOptions([&count](const options_description&){ ++count; }); ASSERT_EQ(count, 1); - device->RunStateMachine(); + device.RunStateMachine(); mgr.WaitForPluginsToReleaseDeviceControl(); }