65 static void loadFromPlugin(std::vector<LoadablePlugin>
const& loadablePlugins, std::vector<CONCRETE>& specs)
76 std::vector<LoadedDSO> loadedDSOs;
77 std::vector<LoadedPlugin> loadedPlugins;
78 for (
auto& loadablePlugin : loadablePlugins) {
79 auto loadedDSO = std::find_if(loadedDSOs.begin(), loadedDSOs.end(), [&loadablePlugin](
auto& dso) {
80 return dso.library == loadablePlugin.library;
83 if (loadedDSO == loadedDSOs.end()) {
86 auto libraryName = fmt::format(
"lib{}.dylib", loadablePlugin.library);
88 auto libraryName = fmt::format(
"lib{}.so", loadablePlugin.library);
90 auto ret = uv_dlopen(libraryName.c_str(), &handle);
92 LOGP(error,
"Could not load library {}", loadablePlugin.library);
93 LOG(error) << uv_dlerror(&handle);
96 loadedDSOs.push_back({loadablePlugin.library, handle});
97 loadedDSO = loadedDSOs.end() - 1;
101 auto loadedPlugin = std::find_if(loadedPlugins.begin(), loadedPlugins.end(), [&loadablePlugin](
auto& plugin) {
102 return plugin.name == loadablePlugin.name;
105 if (loadedPlugin == loadedPlugins.end()) {
107 result = uv_dlsym(&loadedDSO->handle,
"dpl_plugin_callback", (
void**)&dpl_plugin_callback);
109 LOG(error) << uv_dlerror(&loadedDSO->handle);
114 PLUGIN* factory = PluginManager::getByName<PLUGIN>(pluginInstance, loadablePlugin.
name.c_str());
115 if (factory ==
nullptr) {
116 LOGP(error,
"Could not find service {} in library {}", loadablePlugin.name, loadablePlugin.library);
120 loadedPlugins.push_back({loadablePlugin.name, factory});
121 loadedPlugin = loadedPlugins.begin() + loadedPlugins.size() - 1;
123 assert(loadedPlugin != loadedPlugins.end());
124 assert(loadedPlugin->factory !=
nullptr);
126 CONCRETE* spec = loadedPlugin->factory->create();
128 LOG(error) <<
"Plugin " << loadablePlugin.name <<
" could not be created";
131 LOGP(
debug,
"Loading service {} from {}", loadablePlugin.name, loadablePlugin.library);
132 specs.push_back(*spec);