diff options
author | Mykola Korniichuk (GitHub) <42380041+mkorniichuk@users.noreply.github.com> | 2020-02-05 23:30:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-05 16:30:09 -0500 |
commit | fcdacd760c6182e73f3517b3baa0dd10660ff0e8 (patch) | |
tree | 3830c66e6d91bda653f2e7214b7b3231d1b0c9d2 | |
parent | 9dd5d620fed21423f348eb8df329e6527c56b242 (diff) | |
download | sdl_core-fcdacd760c6182e73f3517b3baa0dd10660ff0e8.tar.gz |
Fix potential deadlock in application manager (#3215)
-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 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, |