diff options
author | Mykola Korniichuk (GitHub) <42380041+mkorniichuk@users.noreply.github.com> | 2020-01-29 17:43:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-29 10:43:25 -0500 |
commit | bd7b7ac6f360ef5764be03c2fc9ad1c7672a0d0b (patch) | |
tree | c24a266183ed2907aaf4aeb69c0d6908e79c6df0 | |
parent | 6382911b1e47509c836748cbba9063d14eefed24 (diff) | |
download | sdl_core-bd7b7ac6f360ef5764be03c2fc9ad1c7672a0d0b.tar.gz |
Stop app unregister timer after streaming session restarted (#3202)
* Fix timeout for close application
When application restarts streaming service, while close app timeout
not expired, SDL will unregister application.
* fix clear timer pool
* Fix clear pool timer to be periodic
* fixup! Fix clear pool timer to be periodic
-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 | 63 |
2 files changed, 45 insertions, 27 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 7ac8658dd4..7eb2d43d84 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 @@ -1573,8 +1573,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_; @@ -1601,6 +1604,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 9389b0bcab..32a00033a1 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(); @@ -1873,6 +1878,15 @@ void ApplicationManagerImpl::OnStreamingConfigured( // started audio service service_type == ServiceType::kMobileNav ? it->second.first = true : it->second.second = true; + + for (size_t 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_.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); @@ -3421,8 +3435,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); } } @@ -3588,26 +3602,25 @@ void ApplicationManagerImpl::StartEndStreamTimer(const uint32_t app_id) { this, &ApplicationManagerImpl::EndNaviStreaming))); end_stream_timer->Start(navi_end_stream_timeout_, timer::kSingleShot); - 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); } void ApplicationManagerImpl::ClearTimerPool() { LOG4CXX_AUTO_TRACE(logger_); - - std::vector<TimerSPtr> new_timer_pool; - - sync_primitives::AutoLock lock(timer_pool_lock_); - new_timer_pool.push_back(timer_pool_[0]); - - 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(close_app_timer_pool_lock_); + std::remove_if(close_app_timer_pool_.begin(), + close_app_timer_pool_.end(), + [](TimerSPtr timer) { return !timer->is_running(); }); } - timer_pool_.swap(new_timer_pool); - new_timer_pool.clear(); + { + sync_primitives::AutoLock lock(end_stream_timer_pool_lock_); + std::remove_if(end_stream_timer_pool_.begin(), + end_stream_timer_pool_.end(), + [](TimerSPtr timer) { return !timer->is_running(); }); + } } void ApplicationManagerImpl::CloseNaviApp() { |