diff options
author | Mykola Korniichuk <mkorniichuk@luxoft.com> | 2019-12-16 18:34:50 +0200 |
---|---|---|
committer | Mykola Korniichuk <mkorniichuk@luxoft.com> | 2019-12-16 18:34:50 +0200 |
commit | 3b5dc43f53da752c67185f14de0c84c91e1c4b72 (patch) | |
tree | c79f30338a81d49887ec62883e8d1b0c3e8006c8 | |
parent | e137556512215ded94228e33d21ab4c3e1af3017 (diff) | |
download | sdl_core-fix/restart_stream_service_close_app_timer.tar.gz |
Fix timeout for close applicationfix/restart_stream_service_close_app_timer
When application restarts streaming service, while close app timeout
not expired, SDL will unregister application.
-rw-r--r-- | src/components/application_manager/include/application_manager/application_manager_impl.h | 9 | ||||
-rw-r--r-- | src/components/application_manager/src/application_manager_impl.cc | 70 |
2 files changed, 56 insertions, 23 deletions
diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h index 25e28515d4..4de4951906 100644 --- a/src/components/application_manager/include/application_manager/application_manager_impl.h +++ b/src/components/application_manager/include/application_manager/application_manager_impl.h @@ -1554,8 +1554,11 @@ class ApplicationManagerImpl uint32_t navi_close_app_timeout_; uint32_t navi_end_stream_timeout_; - std::vector<TimerSPtr> timer_pool_; - sync_primitives::Lock timer_pool_lock_; + std::vector<TimerSPtr> close_app_timer_pool_; + std::vector<TimerSPtr> end_stream_timer_pool_; + sync_primitives::Lock close_app_timer_pool_lock_; + sync_primitives::Lock end_stream_timer_pool_lock_; + mutable sync_primitives::RecursiveLock stopping_application_mng_lock_; StateControllerImpl state_ctrl_; std::unique_ptr<app_launch::AppLaunchData> app_launch_dto_; @@ -1582,6 +1585,8 @@ class ApplicationManagerImpl Timer tts_global_properties_timer_; + Timer clear_pool_timer_; + bool is_low_voltage_; uint32_t apps_size_; diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 6187a6daba..e08c40bad4 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -191,6 +191,9 @@ ApplicationManagerImpl::ApplicationManagerImpl( "AM TTSGLPRTimer", new TimerTaskImpl<ApplicationManagerImpl>( this, &ApplicationManagerImpl::OnTimerSendTTSGlobalProperties)) + , clear_pool_timer_("ClearPoolTimer", + new TimerTaskImpl<ApplicationManagerImpl>( + this, &ApplicationManagerImpl::ClearTimerPool)) , is_low_voltage_(false) , apps_size_(0) , is_stopping_(false) { @@ -201,14 +204,9 @@ ApplicationManagerImpl::ApplicationManagerImpl( {TYPE_SYSTEM, "System"}, {TYPE_ICONS, "Icons"}}; - sync_primitives::AutoLock lock(timer_pool_lock_); - TimerSPtr clearing_timer(std::make_shared<timer::Timer>( - "ClearTimerPoolTimer", - new TimerTaskImpl<ApplicationManagerImpl>( - this, &ApplicationManagerImpl::ClearTimerPool))); const uint32_t timeout_ms = 10000u; - clearing_timer->Start(timeout_ms, timer::kSingleShot); - timer_pool_.push_back(clearing_timer); + clear_pool_timer_.Start(timeout_ms, timer::kPeriodic); + rpc_handler_.reset(new rpc_handler::RPCHandlerImpl( *this, hmi_so_factory(), mobile_so_factory())); commands_holder_.reset(new CommandHolderImpl(*this)); @@ -245,8 +243,15 @@ ApplicationManagerImpl::~ApplicationManagerImpl() { LOG4CXX_DEBUG(logger_, "Destroying Policy Handler"); RemovePolicyObserver(this); - sync_primitives::AutoLock lock(timer_pool_lock_); - timer_pool_.clear(); + { + sync_primitives::AutoLock lock(close_app_timer_pool_lock_); + close_app_timer_pool_.clear(); + } + + { + sync_primitives::AutoLock lock(end_stream_timer_pool_lock_); + end_stream_timer_pool_.clear(); + } navi_app_to_stop_.clear(); navi_app_to_end_stream_.clear(); @@ -1893,6 +1898,18 @@ void ApplicationManagerImpl::OnStreamingConfigured( // started audio service service_type == ServiceType::kMobileNav ? it->second.first = true : it->second.second = true; + + for (ulong i = 0; i < navi_app_to_stop_.size(); ++i) { + if (app_id == navi_app_to_stop_[i]) { + { + sync_primitives::AutoLock lock(close_app_timer_pool_lock_); + close_app_timer_pool_[i]->Stop(); + close_app_timer_pool_.erase(close_app_timer_pool_.begin() + i); + navi_app_to_stop_.erase(navi_app_to_stop_.begin() + i); + } + break; + } + } } application(app_id)->StartStreaming(service_type); @@ -3434,8 +3451,8 @@ void ApplicationManagerImpl::EndNaviServices(uint32_t app_id) { this, &ApplicationManagerImpl::CloseNaviApp))); close_timer->Start(navi_close_app_timeout_, timer::kSingleShot); - sync_primitives::AutoLock lock(timer_pool_lock_); - timer_pool_.push_back(close_timer); + sync_primitives::AutoLock lock(close_app_timer_pool_lock_); + close_app_timer_pool_.push_back(close_timer); } } @@ -3511,8 +3528,8 @@ void ApplicationManagerImpl::ProcessApp(const uint32_t app_id, this, &ApplicationManagerImpl::EndNaviStreaming))); end_stream_timer->Start(navi_end_stream_timeout_, timer::kPeriodic); - sync_primitives::AutoLock lock(timer_pool_lock_); - timer_pool_.push_back(end_stream_timer); + sync_primitives::AutoLock lock(end_stream_timer_pool_lock_); + end_stream_timer_pool_.push_back(end_stream_timer); } } else if (to == HMI_NONE) { LOG4CXX_TRACE(logger_, "HMILevel to NONE"); @@ -3526,18 +3543,29 @@ void ApplicationManagerImpl::ClearTimerPool() { LOG4CXX_AUTO_TRACE(logger_); std::vector<TimerSPtr> new_timer_pool; + { + sync_primitives::AutoLock lock(close_app_timer_pool_lock_); + for (size_t i = 0; i < close_app_timer_pool_.size(); ++i) { + if (close_app_timer_pool_[i]->is_running()) { + new_timer_pool.push_back(close_app_timer_pool_[i]); + } + } - sync_primitives::AutoLock lock(timer_pool_lock_); - new_timer_pool.push_back(timer_pool_[0]); + close_app_timer_pool_.swap(new_timer_pool); + new_timer_pool.clear(); + } - for (size_t i = 1; i < timer_pool_.size(); ++i) { - if (timer_pool_[i]->is_running()) { - new_timer_pool.push_back(timer_pool_[i]); + { + sync_primitives::AutoLock lock(end_stream_timer_pool_lock_); + for (size_t i = 0; i < end_stream_timer_pool_.size(); ++i) { + if (end_stream_timer_pool_[i]->is_running()) { + new_timer_pool.push_back(end_stream_timer_pool_[i]); + } } - } - timer_pool_.swap(new_timer_pool); - new_timer_pool.clear(); + end_stream_timer_pool_.swap(new_timer_pool); + new_timer_pool.clear(); + } } void ApplicationManagerImpl::CloseNaviApp() { |