From 1b065f9dfef6ee47721f459625a50db743381315 Mon Sep 17 00:00:00 2001
From: "Piotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics"
Date: Thu, 6 Feb 2025 11:35:11 +0100
Subject: [PATCH] [Application] Modified critical sections to prevent crash
during app closing
[KONA] DF250203-00477
[Verification] Auto TCT application 100%.
Change-Id: I25b32383481c5dd3ed8e7c1d092ef62c9f2263c9
---
src/application/application_manager.cc | 56 +++++++++++++-------------
1 file changed, 28 insertions(+), 28 deletions(-)
diff --git a/src/application/application_manager.cc b/src/application/application_manager.cc
index ab01f231..a82039e0 100644
--- a/src/application/application_manager.cc
+++ b/src/application/application_manager.cc
@@ -439,10 +439,10 @@ PlatformResult PrepareAppControlForLaunchAppControl(const picojson::value& args,
} // namespace
+/* \warning It need to be called inside critical section guarded by launch_app_control_set_mutex_*/
void ApplicationManager::TryRelease(LaunchAppControlCallbackData* callback_data) {
if (0 == --callback_data->reference_count) {
LoggerD("Releasing callback_data: %p", callback_data);
- std::lock_guard lock(launch_app_control_set_mutex_);
launch_app_control_set_global_.erase(callback_data);
callback_data->manager->launch_app_control_set_.erase(callback_data);
delete callback_data;
@@ -515,27 +515,27 @@ void ApplicationManager::LaunchAppControl(const picojson::value& args) {
// Not releasing callback_data here - it was already released in destructor
return;
}
- }
- picojson::value return_value = picojson::value(picojson::object());
- picojson::object& return_value_obj = return_value.get();
- return_value_obj.insert(
- std::make_pair(kListenerId, picojson::value(callback_data->reply_callback_id)));
-
- if (APP_CONTROL_RESULT_SUCCEEDED == result) {
- LoggerD("App started");
- return_value_obj.insert(std::make_pair("data", picojson::value(picojson::array())));
- if (!utils::ServiceToApplicationControlDataArray(
- reply, &return_value_obj.find("data")->second.get())) {
- return_value_obj.erase("data");
+ picojson::value return_value = picojson::value(picojson::object());
+ picojson::object& return_value_obj = return_value.get();
+ return_value_obj.insert(
+ std::make_pair(kListenerId, picojson::value(callback_data->reply_callback_id)));
+
+ if (APP_CONTROL_RESULT_SUCCEEDED == result) {
+ LoggerD("App started");
+ return_value_obj.insert(std::make_pair("data", picojson::value(picojson::array())));
+ if (!utils::ServiceToApplicationControlDataArray(
+ reply, &return_value_obj.find("data")->second.get())) {
+ return_value_obj.erase("data");
+ }
+ ReportSuccess(return_value_obj);
+ } else {
+ ReportError(return_value_obj);
}
- ReportSuccess(return_value_obj);
- } else {
- ReportError(return_value_obj);
- }
- Instance::PostMessage(callback_data->instance, return_value.serialize().c_str());
- TryRelease(callback_data);
+ Instance::PostMessage(callback_data->instance, return_value.serialize().c_str());
+ TryRelease(callback_data);
+ }
};
}
@@ -553,19 +553,19 @@ void ApplicationManager::LaunchAppControl(const picojson::value& args) {
// Not releasing callback_data here - it was already released in destructor
return;
}
- }
- auto result = utils::TranslateAppControlError(launch_result);
+ auto result = utils::TranslateAppControlError(launch_result);
- if (result.IsError()) {
- LogAndReportError(result, &(callback_data->response->get()));
- } else {
- ReportSuccess(callback_data->response->get());
- }
+ if (result.IsError()) {
+ LogAndReportError(result, &(callback_data->response->get()));
+ } else {
+ ReportSuccess(callback_data->response->get());
+ }
- Instance::PostMessage(callback_data->instance, callback_data->response->serialize().c_str());
+ Instance::PostMessage(callback_data->instance, callback_data->response->serialize().c_str());
- TryRelease(callback_data);
+ TryRelease(callback_data);
+ }
};
/*
--
2.34.1