9 #ifndef FAIR_MQ_PLUGINMANAGER_H 10 #define FAIR_MQ_PLUGINMANAGER_H 12 #include <fairmq/Plugin.h> 13 #include <fairmq/PluginServices.h> 14 #include <fairmq/Tools.h> 15 #include <FairMQDevice.h> 16 #define BOOST_FILESYSTEM_VERSION 3 17 #define BOOST_FILESYSTEM_NO_DEPRECATED 18 #include <boost/filesystem.hpp> 19 #include <boost/optional.hpp> 20 #include <boost/program_options.hpp> 21 #include <boost/dll/import.hpp> 22 #include <boost/dll/shared_library.hpp> 23 #include <boost/dll/runtime_symbol_info.hpp> 50 using PluginFactory = std::unique_ptr<fair::mq::Plugin>(
PluginServices&);
53 PluginManager(
const std::vector<std::string> args);
57 LOG(debug) <<
"Shutting down Plugin Manager";
60 auto SetSearchPaths(
const std::vector<boost::filesystem::path>&) -> void;
61 auto AppendSearchPath(
const boost::filesystem::path&) -> void;
62 auto PrependSearchPath(
const boost::filesystem::path&) -> void;
63 auto SearchPaths()
const ->
const std::vector<boost::filesystem::path>& {
return fSearchPaths; }
64 struct BadSearchPath : std::invalid_argument {
using std::invalid_argument::invalid_argument; };
66 auto LoadPlugin(
const std::string& pluginName) -> void;
67 auto LoadPlugins(
const std::vector<std::string>& pluginNames) ->
void {
for(
const auto& pluginName : pluginNames) { LoadPlugin(pluginName); } }
68 struct PluginLoadError : std::runtime_error {
using std::runtime_error::runtime_error; };
69 auto InstantiatePlugins() -> void;
72 static auto ProgramOptions() -> boost::program_options::options_description;
75 static auto LibPrefix() ->
const std::string& {
return fgkLibPrefix; }
77 auto ForEachPlugin(std::function<
void (
Plugin&)> func) ->
void {
for(
const auto& p : fPluginOrder) { func(*fPlugins[p]); } }
78 auto ForEachPluginProgOptions(std::function<
void (boost::program_options::options_description)> func)
const ->
void {
for(
const auto& pair : fPluginProgOptions) { func(pair.second); } }
80 template<
typename... Args>
81 auto EmplacePluginServices(Args&&... args) ->
void { fPluginServices = fair::mq::tools::make_unique<PluginServices>(std::forward<Args>(args)...); };
83 auto WaitForPluginsToReleaseDeviceControl() ->
void { fPluginServices->WaitForReleaseDeviceControl(); }
86 static auto ValidateSearchPath(
const boost::filesystem::path&) -> void;
88 auto LoadPluginPrelinkedDynamic(
const std::string& pluginName) -> void;
89 auto LoadPluginDynamic(
const std::string& pluginName) -> void;
90 auto LoadPluginStatic(
const std::string& pluginName) -> void;
91 template<
typename... Args>
92 auto LoadSymbols(
const std::string& pluginName, Args&&... args) ->
void 94 using namespace boost::dll;
95 using fair::mq::tools::ToString;
97 auto lib = shared_library{std::forward<Args>(args)...};
99 fPluginFactories[pluginName] = import_alias<PluginFactory>(
101 ToString(
"make_", pluginName,
"_plugin")
106 fPluginProgOptions.insert({
108 lib.get_alias<Plugin::ProgOptions()>(ToString(
"get_", pluginName,
"_plugin_progoptions"))().value()
111 catch (
const boost::bad_optional_access& e) { }
114 auto InstantiatePlugin(
const std::string& pluginName) -> void;
116 static const std::string fgkLibPrefix;
117 std::vector<boost::filesystem::path> fSearchPaths;
118 std::map<std::string, std::function<PluginFactory>> fPluginFactories;
119 std::unique_ptr<PluginServices> fPluginServices;
120 std::map<std::string, std::unique_ptr<Plugin>> fPlugins;
121 std::vector<std::string> fPluginOrder;
122 std::map<std::string, boost::program_options::options_description> fPluginProgOptions;
Facilitates communication between devices and plugins.
Definition: PluginServices.h:38
Definition: PluginManager.h:70
Definition: PluginManager.h:64
manages and owns plugin instances
Definition: PluginManager.h:47
Base class for FairMQ plugins.
Definition: Plugin.h:38
Definition: PluginManager.h:68
Tools for interfacing containers to the transport via polymorphic allocators.
Definition: DeviceRunner.h:23
Definition: PluginManager.h:73