From cf9c3869d02b723d3aa74f6b0d25a6d3b810c061 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Fri, 11 Mar 2022 16:11:17 -0500 Subject: Fix crash on shutdown during streaming (#3876) * Fix crash on shutdown during streaming * Fix iterative erase --- .../include/application_manager/request_controller_impl.h | 1 + src/components/application_manager/src/request_controller_impl.cc | 8 +++++--- src/components/application_manager/src/rpc_service_impl.cc | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) (limited to 'src/components') diff --git a/src/components/application_manager/include/application_manager/request_controller_impl.h b/src/components/application_manager/include/application_manager/request_controller_impl.h index 41d2419ba6..1813eab2dc 100644 --- a/src/components/application_manager/include/application_manager/request_controller_impl.h +++ b/src/components/application_manager/include/application_manager/request_controller_impl.h @@ -234,6 +234,7 @@ class RequestControllerImpl : public RequestController, threads::AsyncRunner { * @brief Set of HMI notifications with timeout. */ std::list notification_list_; + sync_primitives::Lock notification_list_lock_; /** * @brief Map keeping track of how many duplicate messages were sent for a diff --git a/src/components/application_manager/src/request_controller_impl.cc b/src/components/application_manager/src/request_controller_impl.cc index b73ebc0b74..79458566dc 100644 --- a/src/components/application_manager/src/request_controller_impl.cc +++ b/src/components/application_manager/src/request_controller_impl.cc @@ -236,16 +236,18 @@ void RequestControllerImpl::AddNotification(const RequestPtr ptr) { "Impossible to add notification due to Low Voltage is active"); return; } + AutoLock auto_lock(notification_list_lock_); notification_list_.push_back(ptr); } void RequestControllerImpl::RemoveNotification( const commands::Command* notification) { SDL_LOG_AUTO_TRACE(); - std::list::iterator it = notification_list_.begin(); + AutoLock auto_lock(notification_list_lock_); + auto it = notification_list_.begin(); for (; notification_list_.end() != it;) { if (it->get() == notification) { - notification_list_.erase(it++); + it = notification_list_.erase(it); SDL_LOG_DEBUG("Notification removed"); return; } else { @@ -372,7 +374,7 @@ void RequestControllerImpl::TerminateWaitingForExecutionAppRequests( while (mobile_request_list_.end() != request_it) { RequestPtr request = (*request_it); if ((request.use_count() != 0) && (request->connection_key() == app_id)) { - mobile_request_list_.erase(request_it++); + request_it = mobile_request_list_.erase(request_it); } else { ++request_it; } diff --git a/src/components/application_manager/src/rpc_service_impl.cc b/src/components/application_manager/src/rpc_service_impl.cc index 36dcb335c1..a5e55dcd0e 100644 --- a/src/components/application_manager/src/rpc_service_impl.cc +++ b/src/components/application_manager/src/rpc_service_impl.cc @@ -228,8 +228,8 @@ bool RPCServiceImpl::ManageMobileCommand( return true; } if (message_type == mobile_apis::messageType::notification) { - request_ctrl_.AddNotification(command); if (command->Init() && command->CheckPermissions()) { + request_ctrl_.AddNotification(command); command->Run(); if (command->CleanUp()) { request_ctrl_.RemoveNotification(command.get()); -- cgit v1.2.1