summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Oleynik (GitHub) <aoleynik@luxoft.com>2017-10-27 15:50:10 +0300
committerAndrey Oleynik (GitHub) <aoleynik@luxoft.com>2017-11-27 09:28:50 +0200
commitdfe3a52d3473e46a22cdce98edbc3c9817be0660 (patch)
tree9911bd00424869a8338e2fb3cf3ac11f052d18a8
parentdfc83025580f39c98dd90bf88ecb9fbaa1ee239a (diff)
downloadsdl_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.cc12
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) {