diff options
Diffstat (limited to 'src/components/application_manager/src')
7 files changed, 106 insertions, 19 deletions
diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc index e4a5304a1b..96a5128691 100644 --- a/src/components/application_manager/src/application_impl.cc +++ b/src/components/application_manager/src/application_impl.cc @@ -148,8 +148,8 @@ ApplicationImpl::ApplicationImpl( "AudioStreamSuspend", new ::timer::TimerTaskImpl<ApplicationImpl>( this, &ApplicationImpl::OnAudioStreamSuspend)) + , extensions_lock_(std::make_shared<sync_primitives::RecursiveLock>()) , hybrid_app_preference_(mobile_api::HybridAppPreference::INVALID_ENUM) - , vi_lock_ptr_(std::make_shared<sync_primitives::Lock>()) , button_lock_ptr_(std::make_shared<sync_primitives::Lock>()) , application_manager_(application_manager) { cmd_number_to_time_limits_[mobile_apis::FunctionID::ReadDIDID] = { @@ -178,12 +178,28 @@ ApplicationImpl::~ApplicationImpl() { active_message_ = NULL; } + button_lock_ptr_->Acquire(); subscribed_buttons_.clear(); + button_lock_ptr_->Release(); + { + sync_primitives::AutoLock lock(cmd_softbuttonid_lock_); + cmd_softbuttonid_.clear(); + } + cmd_number_to_time_limits_.clear(); + if (is_perform_interaction_active()) { set_perform_interaction_active(0); set_perform_interaction_mode(-1); } CleanupFiles(); + { + sync_primitives::AutoLock lock(mobile_message_lock_); + mobile_message_queue_.clear(); + } + { + sync_primitives::AutoLock lock(extensions_lock_); + extensions_.clear(); + } } void ApplicationImpl::CloseActiveMessage() { @@ -1301,6 +1317,7 @@ void ApplicationImpl::set_hmi_level( } AppExtensionPtr ApplicationImpl::QueryInterface(AppExtensionUID uid) { + sync_primitives::AutoLock auto_lock_list(extensions_lock_); std::list<AppExtensionPtr>::const_iterator it = extensions_.begin(); for (; it != extensions_.end(); ++it) { if ((*it)->uid() == uid) { @@ -1315,7 +1332,9 @@ bool ApplicationImpl::AddExtension(AppExtensionPtr extension) { if (!QueryInterface(extension->uid())) { SDL_LOG_TRACE("Add extenstion to add id" << app_id() << " with uid " << extension->uid()); + extensions_lock_->Acquire(); extensions_.push_back(extension); + extensions_lock_->Release(); return true; } return false; @@ -1323,6 +1342,7 @@ bool ApplicationImpl::AddExtension(AppExtensionPtr extension) { bool ApplicationImpl::RemoveExtension(AppExtensionUID uid) { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock_list(extensions_lock_); auto it = std::find_if( extensions_.begin(), extensions_.end(), [uid](AppExtensionPtr extension) { return extension->uid() == uid; @@ -1336,8 +1356,11 @@ bool ApplicationImpl::RemoveExtension(AppExtensionUID uid) { return false; } -const std::list<AppExtensionPtr>& ApplicationImpl::Extensions() const { - return extensions_; +const DataAccessor<std::list<AppExtensionPtr> > ApplicationImpl::Extensions() + const { + DataAccessor<std::list<AppExtensionPtr> > accessor(extensions_, + extensions_lock_); + return accessor; } const std::string& ApplicationImpl::cloud_app_endpoint() const { diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index e88fb42d8a..6b14388b65 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -256,8 +256,35 @@ ApplicationManagerImpl::~ApplicationManagerImpl() { streaming_timer_pool_.clear(); } + { + sync_primitives::AutoLock lock(navi_service_status_lock_); + navi_service_status_.clear(); + } + + { + sync_primitives::AutoLock lock(tts_global_properties_app_list_lock_); + tts_global_properties_app_list_.clear(); + } + + { + sync_primitives::AutoLock lock(apps_to_register_list_lock_ptr_); + apps_to_register_.clear(); + } + + { + sync_primitives::AutoLock lock(reregister_wait_list_lock_ptr_); + reregister_wait_list_.clear(); + } + + { + sync_primitives::AutoLock lock(query_apps_devices_lock_); + query_apps_devices_.clear(); + } clear_pool_timer_.Stop(); secondary_transport_devices_cache_.clear(); + applications_list_lock_ptr_->Acquire(); + applications_.clear(); + applications_list_lock_ptr_->Release(); } DataAccessor<ApplicationSet> ApplicationManagerImpl::applications() const { @@ -984,7 +1011,7 @@ void ApplicationManagerImpl::RefreshCloudAppInformation() { return; #else SDL_LOG_AUTO_TRACE(); - if (is_stopping()) { + if (IsStopping()) { return; } std::vector<std::string> enabled_apps; @@ -3504,10 +3531,6 @@ mobile_apis::Result::eType ApplicationManagerImpl::CheckPolicyPermissions( return mobile_api::Result::SUCCESS; } -bool ApplicationManagerImpl::is_stopping() const { - return is_stopping_; -} - bool ApplicationManagerImpl::is_audio_pass_thru_active() const { return audio_pass_thru_active_; } diff --git a/src/components/application_manager/src/commands/command_impl.cc b/src/components/application_manager/src/commands/command_impl.cc index 34c2a6d6bc..7907cea2ab 100644 --- a/src/components/application_manager/src/commands/command_impl.cc +++ b/src/components/application_manager/src/commands/command_impl.cc @@ -174,6 +174,10 @@ void CommandImpl::SetAllowedToTerminate(const bool allowed) { allowed_to_terminate_ = allowed; } +const ApplicationManager& CommandImpl::GetApplicationManager() const { + return application_manager_; +} + bool CommandImpl::CheckAllowedParameters(const Command::CommandSource source) { SDL_LOG_AUTO_TRACE(); diff --git a/src/components/application_manager/src/request_controller_impl.cc b/src/components/application_manager/src/request_controller_impl.cc index 79458566dc..e331ea89e9 100644 --- a/src/components/application_manager/src/request_controller_impl.cc +++ b/src/components/application_manager/src/request_controller_impl.cc @@ -72,6 +72,24 @@ RequestControllerImpl::RequestControllerImpl( RequestControllerImpl::~RequestControllerImpl() { SDL_LOG_AUTO_TRACE(); Stop(); + + retained_mobile_requests_.clear(); + + { + sync_primitives::AutoLock auto_lock_list(notification_list_lock_); + notification_list_.clear(); + } + + { + sync_primitives::AutoLock auto_lock_list(duplicate_message_count_lock_); + duplicate_message_count_.clear(); + } + + { + sync_primitives::AutoLock auto_lock_list(mobile_request_list_lock_); + mobile_request_list_.clear(); + waiting_for_response_.RemoveMobileRequests(); + } } void RequestControllerImpl::Stop() { @@ -111,7 +129,6 @@ void RequestControllerImpl::InitializeThreadpool() { void RequestControllerImpl::DestroyThreadpool() { SDL_LOG_AUTO_TRACE(); { - AutoLock auto_lock(mobile_request_list_lock_); pool_state_ = TPoolState::STOPPED; SDL_LOG_DEBUG("Broadcasting STOP signal to all threads..."); cond_var_.Broadcast(); // notify all threads we are shutting down @@ -159,7 +176,9 @@ bool RequestControllerImpl::CheckPendingRequestsAmount( SDL_LOG_AUTO_TRACE(); if (pending_requests_amount > 0) { + mobile_request_list_lock_.Acquire(); const size_t pending_requests_size = mobile_request_list_.size(); + mobile_request_list_lock_.Release(); const bool available_to_add = pending_requests_amount > pending_requests_size; if (!available_to_add) { @@ -181,11 +200,12 @@ RequestController::TResult RequestControllerImpl::AddMobileRequest( cond_var_.NotifyOne(); return TResult::INVALID_DATA; } + SDL_LOG_DEBUG("correlation_id : " << request->correlation_id() << "connection_key : " << request->connection_key()); RequestController::TResult result = CheckPosibilitytoAdd(request, hmi_level); - if (TResult::SUCCESS == result) { + if (TResult::SUCCESS == result && TPoolState::STOPPED != pool_state_) { AutoLock auto_lock_list(mobile_request_list_lock_); mobile_request_list_.push_back(request); SDL_LOG_DEBUG("Waiting for execution: " << mobile_request_list_.size()); @@ -431,11 +451,13 @@ void RequestControllerImpl::TerminateWaitingForResponseAppRequests( void RequestControllerImpl::TerminateAppRequests(const uint32_t app_id) { SDL_LOG_AUTO_TRACE(); + mobile_request_list_lock_.Acquire(); SDL_LOG_DEBUG("app_id : " << app_id << "Requests waiting for execution count : " << mobile_request_list_.size() << "Requests waiting for response count : " << waiting_for_response_.Size()); + mobile_request_list_lock_.Release(); TerminateWaitingForExecutionAppRequests(app_id); TerminateWaitingForResponseAppRequests(app_id); @@ -452,8 +474,9 @@ void RequestControllerImpl::TerminateAllMobileRequests() { waiting_for_response_.RemoveMobileRequests(); SDL_LOG_DEBUG("Mobile Requests waiting for response cleared"); - AutoLock waiting_execution_auto_lock(mobile_request_list_lock_); + mobile_request_list_lock_.Acquire(); mobile_request_list_.clear(); + mobile_request_list_lock_.Release(); SDL_LOG_DEBUG("Mobile Requests waiting for execution cleared"); NotifyTimer(); } @@ -590,27 +613,32 @@ RequestControllerImpl::Worker::~Worker() {} void RequestControllerImpl::Worker::threadMain() { SDL_LOG_AUTO_TRACE(); - AutoLock auto_lock(thread_lock_); + AutoLock auto_thread_lock_(thread_lock_); while (!stop_flag_) { // Try to pick a request - AutoLock auto_lock(request_controller_->mobile_request_list_lock_); + request_controller_->mobile_request_list_lock_.Acquire(); while ((request_controller_->pool_state_ != TPoolState::STOPPED) && (request_controller_->mobile_request_list_.empty())) { // Wait until there is a task in the queue // Unlock mutex while wait, then lock it back when signaled SDL_LOG_INFO("Unlocking and waiting"); - request_controller_->cond_var_.Wait(auto_lock); + request_controller_->cond_var_.Wait( + request_controller_->mobile_request_list_lock_); SDL_LOG_INFO("Signaled and locking"); } // If the thread was shutdown, return from here if (request_controller_->pool_state_ == TPoolState::STOPPED) { + SDL_LOG_WARN("TPoolState::STOPPED"); + request_controller_->mobile_request_list_.clear(); + request_controller_->mobile_request_list_lock_.Release(); break; } if (request_controller_->mobile_request_list_.empty()) { SDL_LOG_WARN("Mobile request list is empty"); + request_controller_->mobile_request_list_lock_.Release(); break; } @@ -640,6 +668,7 @@ void RequestControllerImpl::Worker::threadMain() { cmd_request->SendResponse( false, mobile_apis::Result::INVALID_ID, "Duplicate correlation_id"); } + request_controller_->mobile_request_list_lock_.Release(); continue; } SDL_LOG_DEBUG("timeout_in_mseconds " << timeout_in_mseconds); @@ -653,7 +682,7 @@ void RequestControllerImpl::Worker::threadMain() { "of this request."); } - AutoUnlock unlock(auto_lock); + request_controller_->mobile_request_list_lock_.Release(); // execute if ((false == request_controller_->IsLowVoltage()) && @@ -663,6 +692,12 @@ void RequestControllerImpl::Worker::threadMain() { << " with timeout: " << timeout_in_mseconds); request_ptr->Run(); } + if (request_ptr->GetApplicationManager().IsStopping()) { + request_controller_->mobile_request_list_lock_.Acquire(); + request_controller_->mobile_request_list_.clear(); + request_controller_->waiting_for_response_.RemoveMobileRequests(); + request_controller_->mobile_request_list_lock_.Release(); + } } } diff --git a/src/components/application_manager/src/resumption/resumption_data.cc b/src/components/application_manager/src/resumption/resumption_data.cc index 50b95dba42..0663237c43 100644 --- a/src/components/application_manager/src/resumption/resumption_data.cc +++ b/src/components/application_manager/src/resumption/resumption_data.cc @@ -163,7 +163,8 @@ smart_objects::SmartObject ResumptionData::GetApplicationSubscriptions( subscriptions); } - for (auto extension : application->Extensions()) { + auto extensions = application->Extensions(); + for (auto& extension : extensions.GetData()) { extension->SaveResumptionData(subscriptions); } diff --git a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc index 7d65ce75c2..996b4f3026 100644 --- a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc +++ b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc @@ -899,7 +899,8 @@ void ResumptionDataProcessorImpl::AddPluginsSubscriptions( const smart_objects::SmartObject& saved_app) { SDL_LOG_AUTO_TRACE(); - for (auto& extension : application->Extensions()) { + auto extensions = application->Extensions(); + for (auto& extension : extensions.GetData()) { extension->ProcessResumption(saved_app); } } @@ -1004,7 +1005,7 @@ void ResumptionDataProcessorImpl::DeletePluginsSubscriptions( resumption_status_lock_.Release(); auto extensions = application->Extensions(); - for (auto& extension : extensions) { + for (auto& extension : extensions.GetData()) { extension->RevertResumption(resumption_data_to_revert); } } diff --git a/src/components/application_manager/src/rpc_handler_impl.cc b/src/components/application_manager/src/rpc_handler_impl.cc index b6b9f2e16b..3e0a600d72 100644 --- a/src/components/application_manager/src/rpc_handler_impl.cc +++ b/src/components/application_manager/src/rpc_handler_impl.cc @@ -212,7 +212,7 @@ void RPCHandlerImpl::Handle(const impl::MessageFromMobile message) { SDL_LOG_ERROR("Null-pointer message received."); return; } - if (app_manager_.is_stopping()) { + if (app_manager_.IsStopping()) { SDL_LOG_INFO("Application manager is stopping"); return; } |