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