summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordtrunov <dtrunov@luxoft.com>2015-10-30 17:28:51 +0200
committerdtrunov <dtrunov@luxoft.com>2015-12-01 16:36:07 +0200
commitc609ed0f3fbbeec0c59db7cc2925f55a7a5ff957 (patch)
tree329ff06dc4b4d149103d03262f1eb60e60296a92
parentd6120b98447ff89c1cfab05545709c9e70829347 (diff)
downloadsmartdevicelink-c609ed0f3fbbeec0c59db7cc2925f55a7a5ff957.tar.gz
Fix core crash during MASTER_RESET
Forbid processing message from mobile if Core begins stopping of work. Closes-bug: APPLINK-17367
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h4
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc13
2 files changed, 15 insertions, 2 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 2961202bd..f75c40389 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
@@ -1381,6 +1381,7 @@ class ApplicationManagerImpl : public ApplicationManager,
std::vector<ApplicationManagerTimerPtr> timer_pool_;
sync_primitives::Lock timer_pool_lock_;
+ sync_primitives::Lock stopping_flag_lock_;
StateController state_ctrl_;
@@ -1401,8 +1402,7 @@ class ApplicationManagerImpl : public ApplicationManager,
timer::TimerThread<ApplicationManagerImpl> tts_global_properties_timer_;
bool is_low_voltage_;
-
- bool is_stopping_;
+ volatile bool is_stopping_;
DISALLOW_COPY_AND_ASSIGN(ApplicationManagerImpl);
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index 0c686c79a..5feb1aee1 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -102,6 +102,7 @@ ApplicationManagerImpl::ApplicationManagerImpl()
resume_ctrl_(this),
navi_close_app_timeout_(profile::Profile::instance()->stop_streaming_timeout()),
navi_end_stream_timeout_(profile::Profile::instance()->stop_streaming_timeout()),
+ stopping_flag_lock_(true),
#ifdef TIME_TESTER
metric_observer_(NULL),
#endif // TIME_TESTER
@@ -160,7 +161,9 @@ ApplicationManagerImpl::~ApplicationManagerImpl() {
bool ApplicationManagerImpl::Stop() {
LOG4CXX_INFO(logger_, "Stop ApplicationManager.");
+ stopping_flag_lock_.Acquire();
is_stopping_ = true;
+ stopping_flag_lock_.Release();
application_list_update_timer_->stop();
try {
UnregisterAllApplications();
@@ -2126,6 +2129,9 @@ void ApplicationManagerImpl::SetUnregisterAllApplicationsReason(
void ApplicationManagerImpl::HeadUnitReset(
mobile_api::AppInterfaceUnregisteredReason::eType reason) {
+ stopping_flag_lock_.Acquire();
+ is_stopping_ = true;
+ stopping_flag_lock_.Release();
switch (reason) {
case mobile_api::AppInterfaceUnregisteredReason::MASTER_RESET: {
UnregisterAllApplications();
@@ -2355,6 +2361,13 @@ void ApplicationManagerImpl::Handle(const impl::MessageFromMobile message) {
LOG4CXX_ERROR(logger_, "Null-pointer message received.");
return;
}
+ {
+ sync_primitives::AutoLock lock(stopping_flag_lock_);
+ if (is_stopping_) {
+ LOG4CXX_INFO(logger_, "Application manager is stopping");
+ return;
+ }
+ }
ProcessMessageFromMobile(message);
}