summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMykola Korniichuk (GitHub) <42380041+mkorniichuk@users.noreply.github.com>2020-02-05 23:30:09 +0200
committerGitHub <noreply@github.com>2020-02-05 16:30:09 -0500
commitfcdacd760c6182e73f3517b3baa0dd10660ff0e8 (patch)
tree3830c66e6d91bda653f2e7214b7b3231d1b0c9d2
parent9dd5d620fed21423f348eb8df329e6527c56b242 (diff)
downloadsdl_core-fcdacd760c6182e73f3517b3baa0dd10660ff0e8.tar.gz
Fix potential deadlock in application manager (#3215)
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index 32a00033a1..471348c119 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -1580,12 +1580,13 @@ void ApplicationManagerImpl::OnDeviceSwitchingStart(
const connection_handler::Device& device_from,
const connection_handler::Device& device_to) {
LOG4CXX_AUTO_TRACE(logger_);
+ ReregisterWaitList wait_list;
{
auto apps_data_accessor = applications();
std::copy_if(apps_data_accessor.GetData().begin(),
apps_data_accessor.GetData().end(),
- std::back_inserter(reregister_wait_list_),
+ std::back_inserter(wait_list),
std::bind1st(std::ptr_fun(&device_id_comparator),
device_from.mac_address()));
}
@@ -1594,13 +1595,14 @@ void ApplicationManagerImpl::OnDeviceSwitchingStart(
// During sending of UpdateDeviceList this lock is acquired also so making
// it scoped
sync_primitives::AutoLock lock(reregister_wait_list_lock_ptr_);
- for (auto i = reregister_wait_list_.begin();
- reregister_wait_list_.end() != i;
- ++i) {
- auto app = *i;
- request_ctrl_.terminateAppRequests(app->app_id());
- resume_ctrl_->SaveApplication(app);
- }
+ std::copy(wait_list.begin(),
+ wait_list.end(),
+ std::back_inserter(reregister_wait_list_));
+ }
+
+ for (const auto& app : wait_list) {
+ request_ctrl_.terminateAppRequests(app->app_id());
+ resume_ctrl_->SaveApplication(app);
}
policy_handler_->OnDeviceSwitching(device_from.mac_address(),
@@ -1611,20 +1613,22 @@ void ApplicationManagerImpl::OnDeviceSwitchingFinish(
const std::string& device_uid) {
LOG4CXX_AUTO_TRACE(logger_);
UNUSED(device_uid);
- sync_primitives::AutoLock lock(reregister_wait_list_lock_ptr_);
+
+ ReregisterWaitList wait_list;
+ {
+ sync_primitives::AutoLock lock(reregister_wait_list_lock_ptr_);
+ wait_list.swap(reregister_wait_list_);
+ }
const bool unexpected_disonnect = true;
const bool is_resuming = true;
- for (auto app_it = reregister_wait_list_.begin();
- app_it != reregister_wait_list_.end();
- ++app_it) {
- auto app = *app_it;
+
+ for (const auto& app : wait_list) {
UnregisterApplication(app->app_id(),
mobile_apis::Result::INVALID_ENUM,
is_resuming,
unexpected_disonnect);
}
- reregister_wait_list_.clear();
}
void ApplicationManagerImpl::SwitchApplication(ApplicationSharedPtr app,