summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackLivio <jack@livio.io>2022-03-11 16:11:17 -0500
committerGitHub <noreply@github.com>2022-03-11 16:11:17 -0500
commitcf9c3869d02b723d3aa74f6b0d25a6d3b810c061 (patch)
tree61672252ef869a47fc8f04602230e85716a46377
parentc95f2f91b7af6be5adc387cc1f2aba463109f061 (diff)
downloadsdl_core-cf9c3869d02b723d3aa74f6b0d25a6d3b810c061.tar.gz
Fix crash on shutdown during streaming (#3876)
* Fix crash on shutdown during streaming * Fix iterative erase
-rw-r--r--src/components/application_manager/include/application_manager/request_controller_impl.h1
-rw-r--r--src/components/application_manager/src/request_controller_impl.cc8
-rw-r--r--src/components/application_manager/src/rpc_service_impl.cc2
3 files changed, 7 insertions, 4 deletions
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<RequestPtr> 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<RequestPtr>::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());