diff options
author | dtrunov <dtrunov@luxoft.com> | 2016-07-13 11:47:46 +0300 |
---|---|---|
committer | dtrunov <dtrunov@luxoft.com> | 2016-07-13 12:19:09 +0300 |
commit | cf0ac46253ab8359ac3c5e770721bdf3f52040f5 (patch) | |
tree | fc43ac5f583721f7cb3eaf9ae01ba1c668567cfc | |
parent | 5a157d170736e2c88d7cc1e2d284ff7f71496401 (diff) | |
download | sdl_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)
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; } |