summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordtrunov <dtrunov@luxoft.com>2016-07-13 11:47:46 +0300
committerdtrunov <dtrunov@luxoft.com>2016-07-13 12:19:09 +0300
commitcf0ac46253ab8359ac3c5e770721bdf3f52040f5 (patch)
treefc43ac5f583721f7cb3eaf9ae01ba1c668567cfc
parent5a157d170736e2c88d7cc1e2d284ff7f71496401 (diff)
downloadsdl_core-cf0ac46253ab8359ac3c5e770721bdf3f52040f5.tar.gz
Fix core crash during streaming and execution smoke test.
DCHECK appeared because application was unregestered during registration. Fix problem with unregistration application in HMILanguageHandler. Moved DCHECK from hmi_state because it posible if application might be unregistered during processing application in state_ctrl. Added DCHECK for checking app_id when SLD adds hmi state to application. Closes bug:[APPLINK-26397](https://adc.luxoft.com/jira/browse/APPLINK-26397)
-rw-r--r--src/components/application_manager/include/application_manager/hmi_capabilities.h7
-rw-r--r--src/components/application_manager/include/application_manager/hmi_language_handler.h7
-rw-r--r--src/components/application_manager/include/application_manager/hmi_state.h10
-rw-r--r--src/components/application_manager/src/application_impl.cc3
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc2
-rw-r--r--src/components/application_manager/src/commands/mobile/register_app_interface_request.cc25
-rw-r--r--src/components/application_manager/src/hmi_capabilities.cc4
-rw-r--r--src/components/application_manager/src/hmi_language_handler.cc32
-rw-r--r--src/components/application_manager/src/hmi_state.cc3
9 files changed, 69 insertions, 24 deletions
diff --git a/src/components/application_manager/include/application_manager/hmi_capabilities.h b/src/components/application_manager/include/application_manager/hmi_capabilities.h
index 98b9099384..461b1616cd 100644
--- a/src/components/application_manager/include/application_manager/hmi_capabilities.h
+++ b/src/components/application_manager/include/application_manager/hmi_capabilities.h
@@ -416,6 +416,13 @@ class HMICapabilities {
void Init(resumption::LastState* last_state);
+ /**
+ * @brief Removes application from container after
+ * removing application from core
+ * @param app_id id application for removing
+ */
+ void OnUnregisterApplication(uint32_t app_id);
+
protected:
/*
* @brief Loads capabilities from local file in case SDL was launched
diff --git a/src/components/application_manager/include/application_manager/hmi_language_handler.h b/src/components/application_manager/include/application_manager/hmi_language_handler.h
index 6e4d9785f6..e8af02c189 100644
--- a/src/components/application_manager/include/application_manager/hmi_language_handler.h
+++ b/src/components/application_manager/include/application_manager/hmi_language_handler.h
@@ -98,6 +98,13 @@ class HMILanguageHandler : public event_engine::EventObserver {
hmi_apis::Common_Language::eType tts);
void Init(resumption::LastState* value);
+ /**
+ * @brief Removes application from container after
+ * removing application from core
+ * @param app_id id application for removing
+ */
+ void OnUnregisterApplication(uint32_t app_id);
+
private:
void SendOnLanguageChangeToMobile(uint32_t connection_key);
diff --git a/src/components/application_manager/include/application_manager/hmi_state.h b/src/components/application_manager/include/application_manager/hmi_state.h
index 93784e9671..bd8cbdd7fc 100644
--- a/src/components/application_manager/include/application_manager/hmi_state.h
+++ b/src/components/application_manager/include/application_manager/hmi_state.h
@@ -151,7 +151,7 @@ class HmiState {
/**
* @brief state_id state type
- * @return reutrn state type
+ * @return return state type
*/
StateID state_id() const {
return state_id_;
@@ -165,6 +165,14 @@ class HmiState {
state_id_ = state_id;
}
+ /**
+ * @brief return application id
+ * @return return application id
+ */
+ uint32_t app_id() {
+ return app_id_;
+ }
+
protected:
uint32_t app_id_;
StateID state_id_;
diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc
index 61451e3602..a1e8eeed3c 100644
--- a/src/components/application_manager/src/application_impl.cc
+++ b/src/components/application_manager/src/application_impl.cc
@@ -210,6 +210,7 @@ bool ApplicationImpl::IsAudioApplication() const {
void ApplicationImpl::SetRegularState(HmiStatePtr state) {
LOG4CXX_AUTO_TRACE(logger_);
+ DCHECK_OR_RETURN_VOID(state->app_id() == app_id());
state_.AddState(state);
}
@@ -220,6 +221,7 @@ void ApplicationImpl::RemovePostponedState() {
void ApplicationImpl::SetPostponedState(HmiStatePtr state) {
LOG4CXX_AUTO_TRACE(logger_);
+ DCHECK_OR_RETURN_VOID(state->app_id() == app_id());
state_.AddState(state);
}
@@ -233,6 +235,7 @@ struct StateIDComparator {
void ApplicationImpl::AddHMIState(HmiStatePtr state) {
LOG4CXX_AUTO_TRACE(logger_);
+ DCHECK_OR_RETURN_VOID(state->app_id() == app_id());
state_.AddState(state);
}
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index 8ec093d99a..9d4a489609 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -320,6 +320,7 @@ std::vector<ApplicationSharedPtr> ApplicationManagerImpl::IviInfoUpdated(
}
void ApplicationManagerImpl::OnApplicationRegistered(ApplicationSharedPtr app) {
+ LOG4CXX_AUTO_TRACE(logger_);
DCHECK_OR_RETURN_VOID(app);
sync_primitives::AutoLock lock(applications_list_lock_);
const mobile_apis::HMILevel::eType default_level = GetDefaultHmiLevel(app);
@@ -2586,6 +2587,7 @@ void ApplicationManagerImpl::UnregisterApplication(
resume_ctrl_.RemoveApplicationFromSaved(app_to_remove);
}
applications_.erase(app_to_remove);
+ hmi_capabilities_.OnUnregisterApplication(app_id);
AppV4DevicePredicate finder(handle);
ApplicationSharedPtr app = FindApp(accessor, finder);
if (!app) {
diff --git a/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc
index 526ce6e672..412827f7c8 100644
--- a/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc
+++ b/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc
@@ -542,16 +542,25 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile() {
*(application.get()), resumption, need_restore_vr);
SendResponse(true, result_code, add_info.c_str(), &response_params);
- if (result_code != mobile_apis::Result::RESUME_FAILED) {
- resumer.StartResumption(application, hash_id);
+ // Check if application exists, because application might be unregestered
+ // during sending reponse to mobile.
+ application = application_manager_.application(key);
+ if (application) {
+ LOG4CXX_DEBUG(logger_, "Application with app_id = " << key << " exists.");
+ if (result_code != mobile_apis::Result::RESUME_FAILED) {
+ resumer.StartResumption(application, hash_id);
+ } else {
+ resumer.StartResumptionOnlyHMILevel(application);
+ }
+
+ // By default app subscribed to CUSTOM_BUTTON
+ SendSubscribeCustomButtonNotification();
+ MessageHelper::SendChangeRegistrationRequestToHMI(application,
+ application_manager_);
} else {
- resumer.StartResumptionOnlyHMILevel(application);
+ LOG4CXX_DEBUG(logger_,
+ "Application with app_id = " << key << " doesn't exist.");
}
-
- // By default app subscribed to CUSTOM_BUTTON
- SendSubscribeCustomButtonNotification();
- MessageHelper::SendChangeRegistrationRequestToHMI(application,
- application_manager_);
}
void RegisterAppInterfaceRequest::SendOnAppRegisteredNotificationToHMI(
diff --git a/src/components/application_manager/src/hmi_capabilities.cc b/src/components/application_manager/src/hmi_capabilities.cc
index 7535984c16..269815ab78 100644
--- a/src/components/application_manager/src/hmi_capabilities.cc
+++ b/src/components/application_manager/src/hmi_capabilities.cc
@@ -947,4 +947,8 @@ void HMICapabilities::convert_json_languages_to_obj(
}
}
+void HMICapabilities::OnUnregisterApplication(uint32_t app_id) {
+ hmi_language_handler_.OnUnregisterApplication(app_id);
+}
+
} // namespace application_manager
diff --git a/src/components/application_manager/src/hmi_language_handler.cc b/src/components/application_manager/src/hmi_language_handler.cc
index 72ab60eb3a..1bbb0f2051 100644
--- a/src/components/application_manager/src/hmi_language_handler.cc
+++ b/src/components/application_manager/src/hmi_language_handler.cc
@@ -131,8 +131,10 @@ void HMILanguageHandler::on_event(const event_engine::Event& event) {
is_tts_language_received_ = true;
break;
case hmi_apis::FunctionID::BasicCommunication_OnAppRegistered:
- CheckApplication(
- std::make_pair(msg[strings::params][strings::app_id].asUInt(), true));
+ if (msg[strings::params].keyExists(strings::app_id)) {
+ CheckApplication(std::make_pair(
+ msg[strings::params][strings::app_id].asUInt(), true));
+ }
return;
default:
return;
@@ -288,11 +290,14 @@ void HMILanguageHandler::HandleWrongLanguageApp(const Apps::value_type& app) {
<< " is not found within apps with wrong language.");
return;
}
+ apps_.erase(it);
+ if (0 == apps_.size()) {
+ LOG4CXX_DEBUG(logger_,
+ "All apps processed. Unsubscribing from all events.");
+ unsubscribe_from_all_events();
+ }
- LOG4CXX_INFO(logger_,
- "Unregistering application with app_id "
- << app.first << " because of HMI language(s) mismatch.");
-
+ sync_primitives::AutoUnlock un_lock(apps_lock_);
SendOnLanguageChangeToMobile(app.first);
application_manager_.ManageMobileCommand(
MessageHelper::GetOnAppInterfaceUnregisteredNotificationToMobile(
@@ -301,12 +306,9 @@ void HMILanguageHandler::HandleWrongLanguageApp(const Apps::value_type& app) {
commands::Command::ORIGIN_SDL);
application_manager_.UnregisterApplication(
app.first, mobile_apis::Result::SUCCESS, false);
- apps_.erase(it);
- if (0 == apps_.size()) {
- LOG4CXX_DEBUG(logger_,
- "All apps processed. Unsubscribing from all events.");
- unsubscribe_from_all_events();
- }
+ LOG4CXX_INFO(logger_,
+ "Unregistering application with app_id "
+ << app.first << " because of HMI language(s) mismatch.");
}
void HMILanguageHandler::CheckApplication(const Apps::value_type app) {
@@ -332,4 +334,10 @@ void HMILanguageHandler::Init(resumption::LastState* value) {
persisted_tts_language_ = get_language_for(INTERFACE_TTS);
}
+void HMILanguageHandler::OnUnregisterApplication(uint32_t app_id) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ sync_primitives::AutoLock lock(apps_lock_);
+ apps_.erase(app_id);
+}
+
} // namespace application_manager
diff --git a/src/components/application_manager/src/hmi_state.cc b/src/components/application_manager/src/hmi_state.cc
index bad2d8661b..80628f9f33 100644
--- a/src/components/application_manager/src/hmi_state.cc
+++ b/src/components/application_manager/src/hmi_state.cc
@@ -61,19 +61,16 @@ void HmiState::set_parent(HmiStatePtr parent) {
bool HmiState::is_navi_app(const uint32_t app_id) const {
const ApplicationSharedPtr app = app_mngr_.application(app_id);
- DCHECK_OR_RETURN(app, false);
return app ? app->is_navi() : false;
}
bool HmiState::is_media_app(const uint32_t app_id) const {
const ApplicationSharedPtr app = app_mngr_.application(app_id);
- DCHECK_OR_RETURN(app, false);
return app ? app->is_media_application() : false;
}
bool HmiState::is_voice_communication_app(const uint32_t app_id) const {
const ApplicationSharedPtr app = app_mngr_.application(app_id);
- DCHECK_OR_RETURN(app, false);
return app ? app->is_voice_communication_supported() : false;
}