diff options
author | Andrey Oleynik (GitHub) <aoleynik@luxoft.com> | 2017-10-27 15:50:10 +0300 |
---|---|---|
committer | Andriy Byzhynar <AByzhynar@luxoft.com> | 2018-01-18 12:03:50 +0200 |
commit | 02fd128d2790f68b1c8acb6e2115e6984ccc0c8b (patch) | |
tree | d0b4e41af58f977716b542cd2bbabc503a1e318f | |
parent | 0127696c46a24ade4e76e32807175e0cfa5103a0 (diff) | |
download | sdl_core-02fd128d2790f68b1c8acb6e2115e6984ccc0c8b.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 4f9cccb4d9..aea66aa27c 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) { |