Modify APP_NOTIFY_START handler 76/306476/6
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 22 Feb 2024 04:32:02 +0000 (13:32 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 22 Feb 2024 05:05:48 +0000 (14:05 +0900)
when the app status information is not found, amd looks up the appid and
registers the app status  information.

Change-Id: Idf2538afd003fff8601fba1845af2572f68b52c6
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/lib/amd_app_status.cc
src/lib/app_status/app_status.hh
src/lib/app_status/app_status_manager.cc

index cef81c0..6d4944d 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 #include <time.h>
 
+#include <filesystem>
 #include <memory>
 #include <string>
 #include <utility>
 #include "lib/app_status/app_status_manager.hh"
 #include "lib/launch/launch_context.hh"
 
+namespace {
+
+namespace fs = std::filesystem;
+
+std::string GetAppIdFromFile(pid_t pid, uid_t uid) {
+  std::string appid;
+  try {
+    fs::path path =
+        fs::path("/run/aul/apps") / std::to_string(uid) / std::to_string(pid);
+    for (const auto& entry : fs::directory_iterator(path)) {
+      if (entry.is_directory() || entry.path().filename().string()[0] == '.')
+        continue;
+
+      appid = entry.path().filename().string();
+      break;
+    }
+  } catch (const fs::filesystem_error& e) {
+    _E("Exception occurs. error(%s)", e.what());
+  }
+
+  return appid;
+}
+
+}  // namespace
+
 int _app_status_term_bg_apps(GCompareFunc func) {
   return amd::AppStatusManager::GetInst().
       TerminateBackgroundApps(func);
@@ -885,11 +911,22 @@ static int DispatchAppNotifyExit(request_h request) {
 static int DispatchAppNotifyStart(request_h request) {
   auto* req = static_cast<amd::Request*>(request);
   pid_t pid = req->GetPID();
-  auto handle = amd::AppStatusManager::GetInst().Find(pid);
+  auto& manager = amd::AppStatusManager::GetInst();
+  auto handle = manager.Find(pid);
+  if (handle == nullptr) {
+    uid_t uid = req->GetUID();
+    if (uid >= REGULAR_UID_MIN) {
+      std::string appid = GetAppIdFromFile(pid, uid);
+      _W("appid(%s), pid(%d), uid(%u)", appid.c_str(), pid, uid);
+      manager.RegisterPID(pid, appid, uid, pid);
+      handle = manager.Find(pid);
+    }
+  }
+
   if (handle != nullptr && !handle->SocketExists()) {
     handle->SetStarting(true);
     handle->UnsetStartupTimer();
-    amd::AppStatusManager::GetInst().UpdateAppStatusDAO(handle);
+    manager.UpdateAppStatusDAO(handle);
     handle->SetSocketExists(true);
     handle->SetRealPID(pid);
 
index b2dcaf2..3b188d3 100644 (file)
@@ -138,6 +138,7 @@ class AppStatus : public std::enable_shared_from_this<AppStatus> {
   void SetPID(pid_t pid);
 
  private:
+  friend class AppStatusManager;
   static gboolean DyingTimeoutHandler(gpointer user_data);
 
   unsigned int request_id_;
index 0aa6322..e2e97df 100644 (file)
@@ -787,8 +787,15 @@ AppStatusPtr AppStatusManager::AddAppInfo(LaunchContext* context) {
   auto found = pid_map_.find(context->GetPid());
   if (found != pid_map_.end()) {
     auto& app_status = found->second;
-    if (app_status->GetUID() == context->GetTargetUid())
+    if (app_status->GetUID() == context->GetTargetUid()) {
+      app_status->request_id_ = context->GetRequestId();
+      app_status->instance_id_ = context->GetInstanceId();
+      app_status->org_caller_pid_ = context->GetCallerPid();
+      app_status->SetBackgroundLaunch(context->IsBackgroundLaunch());
+      app_status->subapp_ = context->IsSubApp();
+      app_status->debug_mode_ = context->IsDebugMode();
       return app_status;
+    }
 
     Remove(app_status);
   }