diff options
author | Mykola Korniichuk <mkorniichuk@luxoft.com> | 2020-01-17 16:41:44 +0200 |
---|---|---|
committer | Mykola Korniichuk <mkorniichuk@luxoft.com> | 2020-01-17 16:41:44 +0200 |
commit | 4f47ac01293bcaf2422b9265ae5b0ee1ff029f00 (patch) | |
tree | 4f9a5be59157b2ff5c6f8bfa2683f07a0583448e | |
parent | e9709e670196427035466f07786fb0d22d484017 (diff) | |
download | sdl_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.cc | 32 |
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, |