summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMykola Korniichuk (GitHub) <42380041+mkorniichuk@users.noreply.github.com>2020-01-29 17:43:25 +0200
committerGitHub <noreply@github.com>2020-01-29 10:43:25 -0500
commitbd7b7ac6f360ef5764be03c2fc9ad1c7672a0d0b (patch)
treec24a266183ed2907aaf4aeb69c0d6908e79c6df0
parent6382911b1e47509c836748cbba9063d14eefed24 (diff)
downloadsdl_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.h9
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc63
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() {