summaryrefslogtreecommitdiff
path: root/src/components/application_manager/src
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager/src')
-rw-r--r--src/components/application_manager/src/application_impl.cc29
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc33
-rw-r--r--src/components/application_manager/src/commands/command_impl.cc4
-rw-r--r--src/components/application_manager/src/request_controller_impl.cc49
-rw-r--r--src/components/application_manager/src/resumption/resumption_data.cc3
-rw-r--r--src/components/application_manager/src/resumption/resumption_data_processor_impl.cc5
-rw-r--r--src/components/application_manager/src/rpc_handler_impl.cc2
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;
}