diff options
author | Alexander Kutsan (GitHub) <akutsan@luxoft.com> | 2019-08-22 23:08:12 +0300 |
---|---|---|
committer | Collin <iCollin@users.noreply.github.com> | 2019-08-22 16:08:12 -0400 |
commit | 8db0c2601921fdd368bf86133780746b532c40f5 (patch) | |
tree | fd76b6fc43ab46ac571d06f95c2ce0cea04509e3 | |
parent | 0e57834d35230ddbe395096ace053414e811b980 (diff) | |
download | sdl_core-8db0c2601921fdd368bf86133780746b532c40f5.tar.gz |
Fix shutdown crash static var colission (#2939)
* Add apropriate destruction of plugins
Add Delete exported function to each rpc plugin library
Delete funciton will destroy Plugin instance.
Move type defenition of PluginPtr to Plugin manager, because other components should use olugins only by referance.
Add custom destructor for PluginPtr.
custom destructor will call `Delete` function from shared library for plugin instance and unload plugin dl_handle.
Deprecate GetPlugins method because it not used (and actualy shouldnt) by other components.
Refactored LoadPlugin function, make it more readable, make this function as private RPCPluginManagerImpl private method.
* Fix components dependencies after hiding libraries symbols
* Add `-fvisibility=hidden` to avoid collision of static variables
Remove from ABI all shared objects members except functions that needed.
Fixes double destruction crash on shutdown.
For the case if dynamically linked library contains same static variables as binary.
System allocates the same memory for both static variables (in shared object and in binary).
But during exit both binary and shared object destroying this memory.
Mostly is a specific for binaries generated by gcc compiler.
Inspired by https://stackoverflow.com/questions/3570355/c-fvisibility-hidden-fvisibility-inlines-hidden
http://gcc.gnu.org/wiki/Visibility
* Link Policy code statically
SDL components like Application manager Connection Handler, etc ...
requires symbols from policy library.
Also policy library loaded by SDL in run-time as shared library.
Having same library loaded as dynamic and shared library is definitely bad idea.
This commit link extract static policy component and link policy component statically to other components.
* Static linkage of plugins code un plugins unit tests
Unit tests need to be portable and should not depend from dynamic libraries
* Put logs_enabled_ "default" visibility attribute
Logs enables is static variable and it should be shared across
libraries.
On SDL start if set_enabled_logs should put value shared across
libraries
* Changed the order of destruction of objects
Changed the order of destruction of objects to avoid the crash during destruction of the RequestController.
* Change the order of the waiting and finishing thread
Applications using hotplug support
should stop the thread at program exit
and wait finishing thread after calling
libusb_hotplug_deregister_callback.
This call wakes up libusb_handle_events ()
http://libusb.sourceforge.net/api-1.0/group__libusb__asyncio.html
* fixup! Add apropriate destruction of plugins
* Make saftly usage of logger
Added usage unique_ptr for
LogMessageLoopThread to avoid
the crash when
delete_log_message_loop_thread
was not fired.
37 files changed, 182 insertions, 108 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 38bb95c9fa..69c81f3310 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,7 +237,7 @@ set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}) set(ARCHIVE_OUTPUT_DIRECTORY ./bin) set(EXCLUDE_ERROR_FLAGS "-Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations") -set(CMAKE_CXX_FLAGS "-fPIC -std=gnu++0x -Wall -Werror ${EXCLUDE_ERROR_FLAGS} -Wuninitialized -Wvla") +set(CMAKE_CXX_FLAGS "-fPIC -std=gnu++0x -Wall -fvisibility=hidden -Werror ${EXCLUDE_ERROR_FLAGS} -Wuninitialized -Wvla") if (USE_GOLD_LD) execute_process(COMMAND ld -v OUTPUT_VARIABLE result) diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h index add099f975..936497cd15 100644 --- a/src/components/application_manager/include/application_manager/application_manager_impl.h +++ b/src/components/application_manager/include/application_manager/application_manager_impl.h @@ -1428,8 +1428,8 @@ class ApplicationManagerImpl connection_handler::ConnectionHandler* connection_handler_; std::unique_ptr<policy::PolicyHandlerInterface> policy_handler_; protocol_handler::ProtocolHandler* protocol_handler_; - request_controller::RequestController request_ctrl_; std::unique_ptr<plugin_manager::RPCPluginManager> plugin_manager_; + request_controller::RequestController request_ctrl_; std::unique_ptr<application_manager::AppServiceManager> app_service_manager_; /** diff --git a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h index aea0361f19..c3b0d67d67 100644 --- a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h +++ b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h @@ -117,7 +117,6 @@ class RPCPlugin { ApplicationEvent event, application_manager::ApplicationSharedPtr application) = 0; }; -typedef std::unique_ptr<RPCPlugin> RPCPluginPtr; } // namespace plugin_manager } // namespace application_manager diff --git a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager.h b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager.h index b658e40b1c..abf5494ecb 100644 --- a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager.h +++ b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager.h @@ -44,6 +44,10 @@ namespace application_manager { namespace plugin_manager { class RPCPluginManager { + protected: + typedef std::unique_ptr<RPCPlugin, std::function<void(RPCPlugin*)> > + RPCPluginPtr; + public: virtual ~RPCPluginManager() {} /** @@ -59,6 +63,7 @@ class RPCPluginManager { * @brief GetPlugins get list of plugins * @return list of loaded plugins */ + DEPRECATED virtual std::vector<RPCPluginPtr>& GetPlugins() = 0; /** diff --git a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager_impl.h b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager_impl.h index 885181e9c4..368817c89c 100644 --- a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager_impl.h +++ b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager_impl.h @@ -58,12 +58,17 @@ class RPCPluginManagerImpl : public RPCPluginManager { policy::PolicyHandlerInterface& policy_handler); uint32_t LoadPlugins(const std::string& plugins_path) OVERRIDE; + + DEPRECATED std::vector<RPCPluginPtr>& GetPlugins() OVERRIDE; + utils::Optional<RPCPlugin> FindPluginToProcess( const int32_t function_id, const commands::Command::CommandSource message_source) OVERRIDE; private: + RPCPluginPtr LoadPlugin(const std::string& full_plugin_path) const; + std::vector<RPCPluginPtr> loaded_plugins_; ApplicationManager& app_manager_; rpc_service::RPCService& rpc_service_; diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/CMakeLists.txt b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/CMakeLists.txt index 1e23aac8ee..ef215cdd5a 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/CMakeLists.txt @@ -53,22 +53,25 @@ collect_sources(COMMANDS_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/commands") set(LIBRARIES HMI_API MOBILE_API + MessageHelper ApplicationManager + Resumption v4_protocol_v1_2_no_extra SmartObjects Utils - sdl_rpc_plugin + sdl_rpc_plugin_static ) if(ENABLE_LOG) list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -add_library("app_service_rpc_plugin" SHARED ${PLUGIN_SOURCES} ${MOBILE_COMMANDS} ${HMI_COMMANDS} ${COMMANDS_SOURCES}) -target_link_libraries("app_service_rpc_plugin" ${LIBRARIES}) +add_library("app_service_rpc_plugin_static" ${PLUGIN_SOURCES} ${MOBILE_COMMANDS} ${HMI_COMMANDS}) +target_link_libraries("app_service_rpc_plugin_static" ${LIBRARIES}) + +add_library("app_service_rpc_plugin" SHARED "src/app_service_rpc_plugin.cc") +target_link_libraries("app_service_rpc_plugin" app_service_rpc_plugin_static) -add_library("AppServiceRpcPluginStaticLib" ${PLUGIN_SOURCES} ${MOBILE_COMMANDS} ${HMI_COMMANDS}) -target_link_libraries("AppServiceRpcPluginStaticLib" ${LIBRARIES}) set(INSTALL_DESTINATION bin) diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/app_service_rpc_plugin.h b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/app_service_rpc_plugin.h index c9cb98cdfb..1120f68327 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/app_service_rpc_plugin.h +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/app_service_rpc_plugin.h @@ -69,5 +69,6 @@ class AppServiceRpcPlugin : public plugins::RPCPlugin { } // namespace app_service_rpc_plugin extern "C" application_manager::plugin_manager::RPCPlugin* Create(); +extern "C" void Delete(application_manager::plugin_manager::RPCPlugin* data); #endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_APP_SERVICE_PLUGIN_INCLUDE_APP_SERVICE_PLUGIN_APP_SERVICE_PLUGIN_H diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_rpc_plugin.cc index 3b1b0715d4..7195ce234f 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_rpc_plugin.cc +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_rpc_plugin.cc @@ -93,6 +93,13 @@ void AppServiceRpcPlugin::DeleteSubscriptions( } // namespace app_service_rpc_plugin -extern "C" application_manager::plugin_manager::RPCPlugin* Create() { +extern "C" __attribute__((visibility("default"))) +application_manager::plugin_manager::RPCPlugin* +Create() { return new app_service_rpc_plugin::AppServiceRpcPlugin(); } + +extern "C" __attribute__((visibility("default"))) void Delete( + application_manager::plugin_manager::RPCPlugin* data) { + delete data; +}
\ No newline at end of file diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/test/CMakeLists.txt b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/test/CMakeLists.txt index 0b56ddb7e9..0b69c01606 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/test/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/test/CMakeLists.txt @@ -25,16 +25,8 @@ file(GLOB SOURCES set(LIBRARIES gmock - Utils - SmartObjects - HMI_API - MOBILE_API - connectionHandler - app_service_rpc_plugin - sdl_rpc_plugin - jsoncpp - Policy - Resumption + sdl_rpc_plugin_static + app_service_rpc_plugin_static ) create_cotired_test("app_services_commands_test" "${SOURCES}" "${LIBRARIES}" ) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/CMakeLists.txt b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/CMakeLists.txt index 00de927b6e..8129e1240d 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/CMakeLists.txt @@ -50,7 +50,10 @@ collect_sources(COMMANDS_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/commands") set(LIBRARIES HMI_API MOBILE_API + MessageHelper ApplicationManager + ProtocolHandler + connectionHandler v4_protocol_v1_2_no_extra SmartObjects Utils @@ -60,11 +63,12 @@ if(ENABLE_LOG) list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -add_library("rc_rpc_plugin" SHARED ${PLUGIN_SOURCES} ${MOBILE_COMMANDS} ${HMI_COMMANDS} ${COMMANDS_SOURCES}) -target_link_libraries("rc_rpc_plugin" ${LIBRARIES}) +add_library("rc_rpc_plugin_static" ${PLUGIN_SOURCES} ${MOBILE_COMMANDS} ${HMI_COMMANDS}) +target_link_libraries("rc_rpc_plugin_static" ${LIBRARIES}) + +add_library("rc_rpc_plugin" SHARED "src/rc_rpc_plugin.cc") +target_link_libraries("rc_rpc_plugin" rc_rpc_plugin_static) -add_library("RCRpcPluginStaticLib" ${PLUGIN_SOURCES} ${MOBILE_COMMANDS} ${HMI_COMMANDS}) -target_link_libraries("RCRpcPluginStaticLib" ${LIBRARIES}) set(INSTALL_DESTINATION bin) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_rpc_plugin.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_rpc_plugin.h index 303b31f857..cd15674889 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_rpc_plugin.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_rpc_plugin.h @@ -109,5 +109,6 @@ class RCRPCPlugin : public plugins::RPCPlugin { } // namespace rc_rpc_plugin extern "C" application_manager::plugin_manager::RPCPlugin* Create(); +extern "C" void Delete(application_manager::plugin_manager::RPCPlugin* data); #endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_RC_RPC_PLUGIN_INCLUDE_RC_RPC_PLUGIN_RC_RPC_PLUGIN_H_ diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc index 026e03eeff..0c4a5a4e53 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc @@ -136,6 +136,13 @@ RCRPCPlugin::Apps RCRPCPlugin::GetRCApplications( } // namespace rc_rpc_plugin -extern "C" application_manager::plugin_manager::RPCPlugin* Create() { +extern "C" __attribute__((visibility("default"))) +application_manager::plugin_manager::RPCPlugin* +Create() { return new rc_rpc_plugin::RCRPCPlugin(); } // namespace rc_rpc_plugin + +extern "C" __attribute__((visibility("default"))) void Delete( + application_manager::plugin_manager::RPCPlugin* data) { + delete data; +} diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/CMakeLists.txt b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/CMakeLists.txt index c1c59d7e78..c5a191650e 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/CMakeLists.txt @@ -52,17 +52,8 @@ file(GLOB SOURCES ) set(LIBRARIES - RCRpcPluginStaticLib - ApplicationManager - connectionHandler - SmartObjects - ProtocolHandler - MessageHelper - connectionHandler - Utils - jsoncpp + rc_rpc_plugin_static gmock_main - dl ) if(ENABLE_LOG) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt index fdf02b57cb..fe8857b6b1 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt @@ -51,21 +51,27 @@ collect_sources(APP_EXTENSIONS "${EXTENSIONS_SOURCE_DIR}") collect_sources(RPC_PLUGIN_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src") set(LIBRARIES + ApplicationManager HMI_API MOBILE_API - ApplicationManager + MessageHelper + connectionHandler v4_protocol_v1_2_no_extra SmartObjects Utils - Policy + PolicyStatic + jsoncpp ) if(ENABLE_LOG) list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -add_library("sdl_rpc_plugin" SHARED ${MOBILE_COMMANDS} ${HMI_COMMANDS} ${RPC_PLUGIN_SOURCES} ${APP_EXTENSIONS}) -target_link_libraries("sdl_rpc_plugin" ${LIBRARIES}) +add_library("sdl_rpc_plugin_static" ${MOBILE_COMMANDS} ${HMI_COMMANDS} ${RPC_PLUGIN_SOURCES} ${APP_EXTENSIONS}) +target_link_libraries("sdl_rpc_plugin_static" ${LIBRARIES}) + +add_library("sdl_rpc_plugin" SHARED "src/sdl_rpc_plugin.cc") +target_link_libraries("sdl_rpc_plugin" sdl_rpc_plugin_static) set(INSTALL_DESTINATION bin) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_rpc_plugin.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_rpc_plugin.h index 7d482709cb..288410e342 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_rpc_plugin.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_rpc_plugin.h @@ -67,5 +67,5 @@ class SDLRPCPlugin : public plugins::RPCPlugin { } // namespace sdl_rpc_plugin extern "C" application_manager::plugin_manager::RPCPlugin* Create(); - +extern "C" void Delete(application_manager::plugin_manager::RPCPlugin* data); #endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_SDL_RPC_PLUGIN_H diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc index b261b20c24..5522066f76 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc @@ -84,6 +84,13 @@ void SDLRPCPlugin::ClearSubscriptions(app_mngr::ApplicationSharedPtr app) { } // namespace sdl_rpc_plugin -extern "C" application_manager::plugin_manager::RPCPlugin* Create() { +extern "C" __attribute__((visibility("default"))) +application_manager::plugin_manager::RPCPlugin* +Create() { return new sdl_rpc_plugin::SDLRPCPlugin(); } + +extern "C" __attribute__((visibility("default"))) void Delete( + application_manager::plugin_manager::RPCPlugin* data) { + delete data; +}
\ No newline at end of file diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt index 1a206c2cce..b21ab9dca8 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt @@ -23,15 +23,8 @@ file(GLOB SOURCES ) set(LIBRARIES + sdl_rpc_plugin_static gmock - Utils - SmartObjects - HMI_API - MOBILE_API - connectionHandler - sdl_rpc_plugin - jsoncpp - Policy ) create_cotired_test("sdl_commands_test" "${SOURCES}" "${LIBRARIES}" ) diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/CMakeLists.txt b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/CMakeLists.txt index 0e556a6993..8c29cccfff 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/CMakeLists.txt @@ -45,18 +45,25 @@ collect_sources(VEHICLE_INFO_PLUGIN_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src") set(LIBRARIES HMI_API MOBILE_API + MessageHelper ApplicationManager v4_protocol_v1_2_no_extra SmartObjects Utils + jsoncpp + connectionHandler ) if(ENABLE_LOG) list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -add_library("vehicle_info_plugin" SHARED ${MOBILE_COMMANDS} ${HMI_COMMANDS} ${VEHICLE_INFO_PLUGIN_SOURCES}) -target_link_libraries("vehicle_info_plugin" ${LIBRARIES}) +add_library("vehicle_info_plugin_static" ${MOBILE_COMMANDS} ${HMI_COMMANDS} ${VEHICLE_INFO_PLUGIN_SOURCES}) +target_link_libraries("vehicle_info_plugin_static" ${LIBRARIES}) + +add_library(vehicle_info_plugin SHARED "src/vehicle_info_plugin.cc" ) +target_link_libraries(vehicle_info_plugin vehicle_info_plugin_static) + set(INSTALL_DESTINATION bin) diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h index d0e4926a65..7b0b0a59b8 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h @@ -78,5 +78,5 @@ class VehicleInfoPlugin : public plugins::RPCPlugin { } // namespace vehicle_info_plugin extern "C" application_manager::plugin_manager::RPCPlugin* Create(); - +extern "C" void Delete(application_manager::plugin_manager::RPCPlugin* data); #endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_VEHICLE_INFO_PLUGIN_INCLUDE_VEHICLE_INFO_PLUGIN_VEHICLE_INFO_PLUGIN_H diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc index 70210f704e..cc1c22a248 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc @@ -163,6 +163,13 @@ void VehicleInfoPlugin::DeleteSubscriptions( } } // namespace vehicle_info_plugin -extern "C" application_manager::plugin_manager::RPCPlugin* Create() { +extern "C" __attribute__((visibility("default"))) +application_manager::plugin_manager::RPCPlugin* +Create() { return new vehicle_info_plugin::VehicleInfoPlugin(); } + +extern "C" __attribute__((visibility("default"))) void Delete( + application_manager::plugin_manager::RPCPlugin* data) { + delete data; +}
\ No newline at end of file diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/CMakeLists.txt b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/CMakeLists.txt index 3ea4a50a8a..92984b6ad5 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/CMakeLists.txt @@ -51,14 +51,8 @@ file(GLOB SOURCES ) set(LIBRARIES - gmock - Utils - SmartObjects - HMI_API - MOBILE_API - connectionHandler - vehicle_info_plugin - jsoncpp + gmock + vehicle_info_plugin_static ) create_cotired_test("vi_commands_test" "${SOURCES}" "${LIBRARIES}" ) 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_; } diff --git a/src/components/application_manager/test/CMakeLists.txt b/src/components/application_manager/test/CMakeLists.txt index 30c478e790..5b7aa80f20 100755 --- a/src/components/application_manager/test/CMakeLists.txt +++ b/src/components/application_manager/test/CMakeLists.txt @@ -88,7 +88,7 @@ set (RequestController_SOURCES set(LIBRARIES Utils ApplicationManager - sdl_rpc_plugin + sdl_rpc_plugin_static jsoncpp Policy connectionHandler diff --git a/src/components/application_manager/test/commands/CMakeLists.txt b/src/components/application_manager/test/commands/CMakeLists.txt index 556f3a5032..ec7f454c47 100644 --- a/src/components/application_manager/test/commands/CMakeLists.txt +++ b/src/components/application_manager/test/commands/CMakeLists.txt @@ -58,7 +58,7 @@ set(LIBRARIES connectionHandler ApplicationManager jsoncpp - Policy + PolicyStatic Resumption ) diff --git a/src/components/application_manager/test/message_helper/CMakeLists.txt b/src/components/application_manager/test/message_helper/CMakeLists.txt index 99031849f6..31b175cbf0 100755 --- a/src/components/application_manager/test/message_helper/CMakeLists.txt +++ b/src/components/application_manager/test/message_helper/CMakeLists.txt @@ -40,7 +40,7 @@ set(LIBRARIES ApplicationManager MessageHelper jsoncpp - Policy + PolicyStatic connectionHandler MediaManager Resumption diff --git a/src/components/media_manager/test/CMakeLists.txt b/src/components/media_manager/test/CMakeLists.txt index f5d596f681..265a62a0d8 100644 --- a/src/components/media_manager/test/CMakeLists.txt +++ b/src/components/media_manager/test/CMakeLists.txt @@ -58,7 +58,7 @@ set(LIBRARIES connectionHandler encryption Resumption - Policy + PolicyStatic ${SecurityManagerLibrary} ) diff --git a/src/components/policy/policy_external/CMakeLists.txt b/src/components/policy/policy_external/CMakeLists.txt index bd05291245..80c3cb60e6 100644 --- a/src/components/policy/policy_external/CMakeLists.txt +++ b/src/components/policy/policy_external/CMakeLists.txt @@ -29,10 +29,9 @@ # POSSIBILITY OF SUCH DAMAGE. # --- Policy -set(target Policy) set(install_destination bin) set(copy_destination ${CMAKE_BINARY_DIR}/src/appMain) -set(library_name ${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX}) +set(library_name ${CMAKE_SHARED_LIBRARY_PREFIX}Policy${CMAKE_SHARED_LIBRARY_SUFFIX}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") @@ -75,21 +74,25 @@ else () list(APPEND LIBRARIES sqlite3) endif () -add_library(${target} SHARED ${SOURCES}) -target_link_libraries(${target} ${LIBRARIES} ) +add_library(PolicyStatic ${SOURCES}) +target_link_libraries(PolicyStatic ${LIBRARIES}) + + +add_library(Policy SHARED "src/policy_manager_impl.cc") +target_link_libraries(Policy PolicyStatic) if (ENABLE_LOG) - target_link_libraries(${target} log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + target_link_libraries(Policy log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -add_custom_target(copy_library_${target} ALL +add_custom_target(copy_library_Policy ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/${library_name} ${copy_destination} - DEPENDS ${target} + DEPENDS Policy COMMENT "Copying library ${library_name}") -install(TARGETS ${target} +install(TARGETS Policy DESTINATION ${install_destination} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE diff --git a/src/components/policy/policy_external/src/policy_manager_impl.cc b/src/components/policy/policy_external/src/policy_manager_impl.cc index dd33bb86ab..c11bdefb90 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -53,10 +53,12 @@ #include "policy/access_remote.h" #include "policy/access_remote_impl.h" -policy::PolicyManager* CreateManager() { +__attribute__((visibility("default"))) policy::PolicyManager* CreateManager() { return new policy::PolicyManagerImpl(); } -void DeleteManager(policy::PolicyManager* pm) { + +__attribute__((visibility("default"))) void DeleteManager( + policy::PolicyManager* pm) { delete pm; } namespace { diff --git a/src/components/policy/policy_external/test/CMakeLists.txt b/src/components/policy/policy_external/test/CMakeLists.txt index 8b77c90dd2..77b1b35973 100644 --- a/src/components/policy/policy_external/test/CMakeLists.txt +++ b/src/components/policy/policy_external/test/CMakeLists.txt @@ -42,7 +42,7 @@ include_directories( set(testLibraries gmock Utils - Policy + PolicyStatic UsageStatistics ConfigProfile ) diff --git a/src/components/policy/policy_regular/CMakeLists.txt b/src/components/policy/policy_regular/CMakeLists.txt index b7455388e9..f7f34564b6 100644 --- a/src/components/policy/policy_regular/CMakeLists.txt +++ b/src/components/policy/policy_regular/CMakeLists.txt @@ -89,8 +89,13 @@ else () list(APPEND LIBRARIES sqlite3) endif () -add_library(Policy SHARED ${SOURCES}) -target_link_libraries(Policy ${LIBRARIES}) + +add_library(PolicyStatic ${SOURCES}) +target_link_libraries(PolicyStatic ${LIBRARIES}) + + +add_library(Policy SHARED "src/policy_manager_impl.cc") +target_link_libraries(Policy PolicyStatic) if(ENABLE_LOG) target_link_libraries(Policy log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) diff --git a/src/components/policy/policy_regular/src/policy_manager_impl.cc b/src/components/policy/policy_regular/src/policy_manager_impl.cc index 8bfa001293..5a7c822a9b 100644 --- a/src/components/policy/policy_regular/src/policy_manager_impl.cc +++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc @@ -53,10 +53,12 @@ #include "policy/access_remote.h" #include "policy/access_remote_impl.h" -policy::PolicyManager* CreateManager() { +__attribute__((visibility("default"))) policy::PolicyManager* CreateManager() { return new policy::PolicyManagerImpl(); } -void DeleteManager(policy::PolicyManager* pm) { + +__attribute__((visibility("default"))) void DeleteManager( + policy::PolicyManager* pm) { delete pm; } diff --git a/src/components/policy/policy_regular/test/CMakeLists.txt b/src/components/policy/policy_regular/test/CMakeLists.txt index bd6af96867..428a056882 100644 --- a/src/components/policy/policy_regular/test/CMakeLists.txt +++ b/src/components/policy/policy_regular/test/CMakeLists.txt @@ -49,7 +49,7 @@ collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") set(LIBRARIES gmock Utils - Policy + PolicyStatic UsageStatistics ) diff --git a/src/components/telemetry_monitor/CMakeLists.txt b/src/components/telemetry_monitor/CMakeLists.txt index 093413ef3b..a9c0e14224 100644 --- a/src/components/telemetry_monitor/CMakeLists.txt +++ b/src/components/telemetry_monitor/CMakeLists.txt @@ -63,7 +63,7 @@ set(LIBRARIES HMI_API MOBILE_API Utils - Policy + PolicyStatic ) add_library("TelemetryMonitor" ${SOURCES}) diff --git a/src/components/transport_manager/src/usb/libusb/usb_handler.cc b/src/components/transport_manager/src/usb/libusb/usb_handler.cc index df3b7e128e..975f71e84c 100644 --- a/src/components/transport_manager/src/usb/libusb/usb_handler.cc +++ b/src/components/transport_manager/src/usb/libusb/usb_handler.cc @@ -90,20 +90,20 @@ UsbHandler::UsbHandler() UsbHandler::~UsbHandler() { shutdown_requested_ = true; - if (libusb_context_ != 0) { + thread_->stop(); + LOG4CXX_INFO(logger_, "UsbHandler thread finished"); + if (libusb_context_ != 0) { // This wakes up libusb_handle_events() libusb_hotplug_deregister_callback(libusb_context_, arrived_callback_handle_); libusb_hotplug_deregister_callback(libusb_context_, left_callback_handle_); } - thread_->stop(); - LOG4CXX_INFO(logger_, "UsbHandler thread finished"); + thread_->join(); + delete thread_->delegate(); + threads::DeleteThread(thread_); if (libusb_context_) { libusb_exit(libusb_context_); libusb_context_ = 0; } - thread_->join(); - delete thread_->delegate(); - threads::DeleteThread(thread_); } void UsbHandler::DeviceArrived(libusb_device* device_libusb) { diff --git a/src/components/utils/CMakeLists.txt b/src/components/utils/CMakeLists.txt index 9562b50e78..451a8a629e 100644 --- a/src/components/utils/CMakeLists.txt +++ b/src/components/utils/CMakeLists.txt @@ -58,7 +58,10 @@ set(EXCLUDE_PATHS ${DBMS_PATHS} ) -set(LIBRARIES) +set(LIBRARIES + encryption + jsoncpp +) if(NOT BUILD_BACKTRACE_SUPPORT) list(APPEND EXCLUDE_PATHS diff --git a/src/components/utils/src/push_log.cc b/src/components/utils/src/push_log.cc index 6e16c99181..dea0e75274 100644 --- a/src/components/utils/src/push_log.cc +++ b/src/components/utils/src/push_log.cc @@ -36,8 +36,12 @@ namespace logger { -static bool logs_enabled_ = false; -static LogMessageLoopThread* log_message_loop_thread = NULL; +struct __attribute__((visibility("default"))) LogsEnabled { + static std::atomic_bool logs_enabled_; +}; + +std::atomic_bool LogsEnabled::logs_enabled_(false); +static std::unique_ptr<LogMessageLoopThread> log_message_loop_thread; bool push_log(log4cxx::LoggerPtr logger, log4cxx::LevelPtr level, @@ -73,22 +77,22 @@ bool push_log(log4cxx::LoggerPtr logger, } bool logs_enabled() { - return logs_enabled_; + return LogsEnabled::logs_enabled_; } void set_logs_enabled(bool state) { - logs_enabled_ = state; + LogsEnabled::logs_enabled_ = state; } void create_log_message_loop_thread() { if (!log_message_loop_thread) { - log_message_loop_thread = new LogMessageLoopThread(); + log_message_loop_thread = + std::unique_ptr<LogMessageLoopThread>(new LogMessageLoopThread); } } void delete_log_message_loop_thread() { - delete log_message_loop_thread; - log_message_loop_thread = NULL; + log_message_loop_thread.reset(); } void flush_logger() { diff --git a/src/components/utils/test/CMakeLists.txt b/src/components/utils/test/CMakeLists.txt index f6bd24ff09..b5127ccabc 100644 --- a/src/components/utils/test/CMakeLists.txt +++ b/src/components/utils/test/CMakeLists.txt @@ -87,7 +87,7 @@ collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") set(LIBRARIES gmock Utils - Policy + PolicyStatic ConfigProfile ) |