diff options
Diffstat (limited to 'src/components')
12 files changed, 94 insertions, 49 deletions
diff --git a/src/components/application_manager/include/application_manager/policies/policy_handler.h b/src/components/application_manager/include/application_manager/policies/policy_handler.h index 9ca7761426..61cf2cf480 100644 --- a/src/components/application_manager/include/application_manager/policies/policy_handler.h +++ b/src/components/application_manager/include/application_manager/policies/policy_handler.h @@ -864,7 +864,6 @@ class PolicyHandler : public PolicyHandlerInterface, mutable sync_primitives::RWLock policy_manager_lock_; std::shared_ptr<PolicyManager> policy_manager_; - void* dl_handle_; std::shared_ptr<PolicyEventObserver> event_observer_; uint32_t last_activated_app_id_; 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 79c6d9005e..0e739522d9 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 @@ -104,4 +104,5 @@ Create() { extern "C" __attribute__((visibility("default"))) void Delete( application_manager::plugin_manager::RPCPlugin* data) { delete data; -}
\ No newline at end of file + DELETE_THREAD_LOGGER(app_service_rpc_plugin::logger_); +} 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 ed6b863e20..9005eb7fd0 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 @@ -170,4 +170,5 @@ Create() { extern "C" __attribute__((visibility("default"))) void Delete( application_manager::plugin_manager::RPCPlugin* data) { delete data; + DELETE_THREAD_LOGGER(rc_rpc_plugin::logger_); } 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 05ff794aee..35d3fbe2f6 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 @@ -101,4 +101,5 @@ Create() { extern "C" __attribute__((visibility("default"))) void Delete( application_manager::plugin_manager::RPCPlugin* data) { delete data; -}
\ No newline at end of file + DELETE_THREAD_LOGGER(sdl_rpc_plugin::logger_); +} 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 aa45ee704a..4799af98b7 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 @@ -182,4 +182,5 @@ Create() { extern "C" __attribute__((visibility("default"))) void Delete( application_manager::plugin_manager::RPCPlugin* data) { delete data; -}
\ No newline at end of file + DELETE_THREAD_LOGGER(vehicle_info_plugin::logger_); +} diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index f88eaf47a5..8c27c44aae 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -298,7 +298,6 @@ const std::string PolicyHandler::kLibrary = "libPolicy.so"; PolicyHandler::PolicyHandler(const PolicySettings& settings, ApplicationManager& application_manager) : AsyncRunner("PolicyHandler async runner thread") - , dl_handle_(0) , last_activated_app_id_(0) , statistic_manager_impl_(std::make_shared<StatisticManagerImpl>(this)) , settings_(settings) @@ -325,36 +324,43 @@ bool PolicyHandler::LoadPolicyLibrary() { policy_manager_.reset(); return false; } - dl_handle_ = dlopen(kLibrary.c_str(), RTLD_LAZY); - const char* error = dlerror(); - if (!error) { - if (CreateManager()) { - policy_manager_->set_listener(this); - event_observer_ = - std::shared_ptr<PolicyEventObserver>(new PolicyEventObserver( - this, application_manager_.event_dispatcher())); - } - } else { - LOG4CXX_ERROR(logger_, error); + if (CreateManager()) { + policy_manager_->set_listener(this); + event_observer_ = std::shared_ptr<PolicyEventObserver>( + new PolicyEventObserver(this, application_manager_.event_dispatcher())); } return (policy_manager_.use_count() != 0); } bool PolicyHandler::CreateManager() { + void* policy_handle = dlopen(kLibrary.c_str(), RTLD_LAZY); + const char* error = dlerror(); + if (error) { + LOG4CXX_ERROR(logger_, error); + return false; + } + typedef PolicyManager* (*CreateManager)(); typedef void (*DeleteManager)(PolicyManager*); CreateManager create_manager = - reinterpret_cast<CreateManager>(dlsym(dl_handle_, "CreateManager")); + reinterpret_cast<CreateManager>(dlsym(policy_handle, "CreateManager")); DeleteManager delete_manager = - reinterpret_cast<DeleteManager>(dlsym(dl_handle_, "DeleteManager")); + reinterpret_cast<DeleteManager>(dlsym(policy_handle, "DeleteManager")); + auto policy_destroyer = [delete_manager, + policy_handle](PolicyManager* policy_manager) { + LOG4CXX_DEBUG(logger_, "Delete Policy Manager"); + delete_manager(policy_manager); + dlclose(policy_handle); + }; char* error_string = dlerror(); if (NULL == error_string) { policy_manager_ = - std::shared_ptr<PolicyManager>(create_manager(), delete_manager); + std::shared_ptr<PolicyManager>(create_manager(), policy_destroyer); } else { LOG4CXX_WARN(logger_, error_string); + dlclose(policy_handle); } return (policy_manager_.use_count() != 0); } @@ -1131,10 +1137,6 @@ bool PolicyHandler::UnloadPolicyLibrary() { if (policy_manager_) { policy_manager_.reset(); } - if (dl_handle_) { - ret = (dlclose(dl_handle_) == 0); - dl_handle_ = 0; - } LOG4CXX_TRACE(logger_, "exit"); return ret; } diff --git a/src/components/include/utils/logger.h b/src/components/include/utils/logger.h index 907f8f4db0..d492cfcb1b 100644 --- a/src/components/include/utils/logger.h +++ b/src/components/include/utils/logger.h @@ -65,6 +65,11 @@ void deinit_logger(); #define DEINIT_LOGGER() deinit_logger() +// Logger thread deinitilization macro that need to stop the thread of handling +// messages for the log4cxx +#define DELETE_THREAD_LOGGER(logger_var) \ + logger::delete_log_message_loop_thread(logger_var) + // special macros to dump logs from queue // it's need, for example, when crash happend #define FLUSH_LOGGER() logger::flush_logger() @@ -141,6 +146,8 @@ log4cxx_time_t time_now(); #define DEINIT_LOGGER() +#define DELETE_THREAD_LOGGER(logger_var) + #define FLUSH_LOGGER() #define LOG4CXX_IS_TRACE_ENABLED(logger) false diff --git a/src/components/include/utils/push_log.h b/src/components/include/utils/push_log.h index aaeaa83bae..f6c396ae71 100644 --- a/src/components/include/utils/push_log.h +++ b/src/components/include/utils/push_log.h @@ -51,7 +51,7 @@ bool logs_enabled(); void set_logs_enabled(bool state); void create_log_message_loop_thread(); -void delete_log_message_loop_thread(); +void delete_log_message_loop_thread(log4cxx::LoggerPtr& logger); } // namespace logger #endif // SRC_COMPONENTS_INCLUDE_UTILS_PUSH_LOG_H_ 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 bd3c5ef658..871d34df7c 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -54,14 +54,6 @@ #include "policy/access_remote_impl.h" #include "utils/timer_task_impl.h" -__attribute__((visibility("default"))) policy::PolicyManager* CreateManager() { - return new policy::PolicyManagerImpl(); -} - -__attribute__((visibility("default"))) void DeleteManager( - policy::PolicyManager* pm) { - delete pm; -} namespace { /** @@ -2523,3 +2515,13 @@ const std::vector<std::string> PolicyManagerImpl::GetRPCsForFunctionGroup( } } // namespace policy + +__attribute__((visibility("default"))) policy::PolicyManager* CreateManager() { + return new policy::PolicyManagerImpl(); +} + +__attribute__((visibility("default"))) void DeleteManager( + policy::PolicyManager* pm) { + delete pm; + DELETE_THREAD_LOGGER(policy::logger_); +} 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 a48fe7d197..52c5ac5706 100644 --- a/src/components/policy/policy_regular/src/policy_manager_impl.cc +++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc @@ -53,15 +53,6 @@ #include "policy/access_remote.h" #include "policy/access_remote_impl.h" -__attribute__((visibility("default"))) policy::PolicyManager* CreateManager() { - return new policy::PolicyManagerImpl(); -} - -__attribute__((visibility("default"))) void DeleteManager( - policy::PolicyManager* pm) { - delete pm; -} - namespace { const uint32_t kDefaultRetryTimeoutInMSec = 60u * date_time::MILLISECONDS_IN_SECOND; @@ -1814,3 +1805,13 @@ const std::vector<std::string> PolicyManagerImpl::GetRPCsForFunctionGroup( } } // namespace policy + +__attribute__((visibility("default"))) policy::PolicyManager* CreateManager() { + return new policy::PolicyManagerImpl(); +} + +__attribute__((visibility("default"))) void DeleteManager( + policy::PolicyManager* pm) { + delete pm; + DELETE_THREAD_LOGGER(policy::logger_); +} diff --git a/src/components/utils/src/logger.cc b/src/components/utils/src/logger.cc index 2a4b8eb108..5a7922afc4 100644 --- a/src/components/utils/src/logger.cc +++ b/src/components/utils/src/logger.cc @@ -39,11 +39,8 @@ void deinit_logger() { CREATE_LOGGERPTR_LOCAL(logger_, "Utils") LOG4CXX_DEBUG(logger_, "Logger deinitialization"); logger::set_logs_enabled(false); - if (logger::logger_status == logger::LoggerThreadCreated) { - logger::flush_logger(); - } - logger::delete_log_message_loop_thread(); log4cxx::LoggerPtr rootLogger = log4cxx::Logger::getRootLogger(); + logger::delete_log_message_loop_thread(rootLogger); log4cxx::spi::LoggerRepositoryPtr repository = rootLogger->getLoggerRepository(); log4cxx::LoggerList loggers = repository->getCurrentLoggers(); diff --git a/src/components/utils/src/push_log.cc b/src/components/utils/src/push_log.cc index dea0e75274..f9d1cd738a 100644 --- a/src/components/utils/src/push_log.cc +++ b/src/components/utils/src/push_log.cc @@ -41,7 +41,16 @@ struct __attribute__((visibility("default"))) LogsEnabled { }; std::atomic_bool LogsEnabled::logs_enabled_(false); -static std::unique_ptr<LogMessageLoopThread> log_message_loop_thread; + +template <typename T> +using logger_ptr = std::unique_ptr<T, std::function<void(T*)> >; + +static logger_ptr<LogMessageLoopThread> log_message_loop_thread; + +auto deinit_logger = [](LogMessageLoopThread* logMsgThread) { + delete logMsgThread; + logger::logger_status = logger::LoggerThreadNotCreated; +}; bool push_log(log4cxx::LoggerPtr logger, log4cxx::LevelPtr level, @@ -86,13 +95,37 @@ void set_logs_enabled(bool state) { void create_log_message_loop_thread() { if (!log_message_loop_thread) { - log_message_loop_thread = - std::unique_ptr<LogMessageLoopThread>(new LogMessageLoopThread); + log_message_loop_thread = logger_ptr<LogMessageLoopThread>( + new LogMessageLoopThread, deinit_logger); } } -void delete_log_message_loop_thread() { +void delete_log_message_loop_thread(log4cxx::LoggerPtr& logger) { + if (logger::logger_status == logger::LoggerThreadCreated) { + logger::flush_logger(); + } + log_message_loop_thread.reset(); + + if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) { + ::log4cxx::helpers::MessageBuffer oss_; + logger->forcedLog(::log4cxx::Level::getDebug(), + oss_.str(oss_ << "Logger loop thread deinitialized"), + LOG4CXX_LOCATION); + } + + if (logger->getRootLogger() == logger) { + return; + } + + if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) { + ::log4cxx::helpers::MessageBuffer oss_; + logger->forcedLog(::log4cxx::Level::getDebug(), + oss_.str(oss_ << "Logger calling removeAllAppenders"), + LOG4CXX_LOCATION); + } + + logger->removeAllAppenders(); } void flush_logger() { |