summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMykola Korniichuk <mkorniichuk@luxoft.com>2020-01-17 16:41:44 +0200
committerMykola Korniichuk <mkorniichuk@luxoft.com>2020-01-17 16:41:44 +0200
commit4f47ac01293bcaf2422b9265ae5b0ee1ff029f00 (patch)
tree4f9a5be59157b2ff5c6f8bfa2683f07a0583448e
parente9709e670196427035466f07786fb0d22d484017 (diff)
downloadsdl_core-fix/deadlock_in_appmanager.tar.gz
Fix potential deadlock in application managerfix/deadlock_in_appmanager
-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 974f125def..c6b11e52d5 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -1575,12 +1575,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()));
}
@@ -1589,13 +1590,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(),
@@ -1628,20 +1630,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,