diff options
Diffstat (limited to 'src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc')
-rw-r--r-- | src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc b/src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc index ad313c638f..2248711037 100644 --- a/src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc +++ b/src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc @@ -29,10 +29,23 @@ bool IsLibraryFile(const std::string& file_path) { return true; } -RPCPluginPtr LoadPlugin(const std::string& full_plugin_path) { +template <typename T> +T GetFuncFromLib(void* dl_handle, const std::string& function_name) { + T exported_func = + reinterpret_cast<T>(dlsym(dl_handle, function_name.c_str())); + char* error_string = dlerror(); + if (nullptr != error_string) { + LOG4CXX_ERROR(logger_, "Failed to export symbols : " << error_string); + return nullptr; + } + return exported_func; +} + +RPCPluginManagerImpl::RPCPluginPtr RPCPluginManagerImpl::LoadPlugin( + const std::string& full_plugin_path) const { if (!IsLibraryFile(full_plugin_path)) { LOG4CXX_DEBUG(logger_, "Skip loading " << full_plugin_path); - return RPCPluginPtr(); + return RPCPluginPtr(nullptr, [](RPCPlugin*) {}); } void* plugin_dll = dlopen(full_plugin_path.c_str(), RTLD_LAZY); @@ -40,21 +53,33 @@ RPCPluginPtr LoadPlugin(const std::string& full_plugin_path) { LOG4CXX_ERROR( logger_, "Failed to open dll " << full_plugin_path << " : " << dlerror()); - return RPCPluginPtr(); + return RPCPluginPtr(nullptr, [](RPCPlugin*) {}); } typedef RPCPlugin* (*Create)(); - Create create_plugin = reinterpret_cast<Create>(dlsym(plugin_dll, "Create")); - char* error_string = dlerror(); - if (nullptr != error_string) { - LOG4CXX_ERROR(logger_, - "Failed to export dll's " << full_plugin_path - << " symbols : " << error_string); + Create create_plugin = GetFuncFromLib<Create>(plugin_dll, "Create"); + if (!create_plugin) { + LOG4CXX_ERROR(logger_, "No Create function in " << full_plugin_path); + dlclose(plugin_dll); + return RPCPluginPtr(nullptr, [](RPCPlugin*) {}); + } + + typedef void (*Delete)(RPCPlugin*); + Delete delete_plugin = GetFuncFromLib<Delete>(plugin_dll, "Delete"); + if (!delete_plugin) { + LOG4CXX_ERROR(logger_, "No Delete function in " << full_plugin_path); dlclose(plugin_dll); - return RPCPluginPtr(); + return RPCPluginPtr(nullptr, [](RPCPlugin*) {}); } + + auto plugin_destroyer = [delete_plugin, plugin_dll](RPCPlugin* plugin) { + LOG4CXX_DEBUG(logger_, "Delete plugin " << plugin->PluginName()); + delete_plugin(plugin); + dlclose(plugin_dll); + return RPCPluginPtr(nullptr, [](RPCPlugin*) {}); + }; RPCPlugin* plugin = create_plugin(); - return RPCPluginPtr(plugin); + return RPCPluginPtr(plugin, plugin_destroyer); } uint32_t RPCPluginManagerImpl::LoadPlugins(const std::string& plugins_path) { @@ -82,7 +107,8 @@ uint32_t RPCPluginManagerImpl::LoadPlugins(const std::string& plugins_path) { return loaded_plugins_.size(); } -std::vector<RPCPluginPtr>& RPCPluginManagerImpl::GetPlugins() { +std::vector<RPCPluginManagerImpl::RPCPluginPtr>& +RPCPluginManagerImpl::GetPlugins() { return loaded_plugins_; } |