[Application] Modified critical sections to prevent crash during app closing 60/319260/2
authorPiotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Thu, 6 Feb 2025 10:35:11 +0000 (11:35 +0100)
committerPiotr Kosko <p.kosko@samsung.com>
Thu, 6 Feb 2025 11:54:44 +0000 (11:54 +0000)
[KONA] DF250203-00477

[Verification] Auto TCT application 100%.

Change-Id: I25b32383481c5dd3ed8e7c1d092ef62c9f2263c9

src/application/application_manager.cc

index ab01f23130413aa38e8edf0785eb11373e93625f..a82039e0ec6d26e8e8999c547ce79248d16e45f2 100644 (file)
@@ -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<std::mutex> 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<picojson::object>();
-      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<picojson::array>())) {
-          return_value_obj.erase("data");
+        picojson::value return_value = picojson::value(picojson::object());
+        picojson::object& return_value_obj = return_value.get<picojson::object>();
+        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<picojson::array>())) {
+            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<picojson::object>()));
-    } else {
-      ReportSuccess(callback_data->response->get<picojson::object>());
-    }
+      if (result.IsError()) {
+        LogAndReportError(result, &(callback_data->response->get<picojson::object>()));
+      } else {
+        ReportSuccess(callback_data->response->get<picojson::object>());
+      }
 
-    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);
+    }
   };
 
   /*