diff options
author | Andrey Oleynik (GitHub) <aoleynik@luxoft.com> | 2017-10-27 15:50:10 +0300 |
---|---|---|
committer | Andrey Oleynik (GitHub) <aoleynik@luxoft.com> | 2017-11-27 09:28:50 +0200 |
commit | dfe3a52d3473e46a22cdce98edbc3c9817be0660 (patch) | |
tree | 9911bd00424869a8338e2fb3cf3ac11f052d18a8 | |
parent | dfc83025580f39c98dd90bf88ecb9fbaa1ee239a (diff) | |
download | sdl_core-dfe3a52d3473e46a22cdce98edbc3c9817be0660.tar.gz |
Fixes deadlock on resume data saving during transport switch
Issue was happening due to
- resume data restoring thread was acquiring app subscription lock and
then application list lock
- transport switching thread was acquiring application lock and was
saving resume data and trying to get subscription lock
Now after filtering switching application from application list its lock
will be released
-rw-r--r-- | src/components/application_manager/src/application_manager_impl.cc | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 0effb89cef..1fa6942633 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -1074,12 +1074,14 @@ void ApplicationManagerImpl::OnDeviceSwitchingStart( const std::string& device_uid) { LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock lock(reregister_wait_list_lock_); - auto apps_data_accessor = applications(); + { + 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::bind1st(std::ptr_fun(&device_id_comparator), device_uid)); + std::copy_if(apps_data_accessor.GetData().begin(), + apps_data_accessor.GetData().end(), + std::back_inserter(reregister_wait_list_), + std::bind1st(std::ptr_fun(&device_id_comparator), device_uid)); + } for (auto i = reregister_wait_list_.begin(); reregister_wait_list_.end() != i; ++i) { |