e_appinfo: remove duplicated E_Appinfo when pid/appid set 41/246241/3
authorJunseok, Kim <juns.kim@samsung.com>
Tue, 27 Oct 2020 07:34:26 +0000 (16:34 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Wed, 28 Oct 2020 10:39:36 +0000 (10:39 +0000)
Change-Id: I5b2f2e20dcf566a54e4f25532ededdf8cbb19e8e
Signed-off-by: Junseok, Kim <juns.kim@samsung.com>
src/bin/e_appinfo.c

index 10e7c6b2e4f412742efbac99bfbf4433be05d0f4..4ba6c290d6169048c45c681025b297173bca6f54 100644 (file)
@@ -99,9 +99,37 @@ e_appinfo_pid_get(E_Appinfo *epai)
 EINTERN Eina_Bool
 e_appinfo_pid_set(E_Appinfo *eai, pid_t pid)
 {
+   E_Appinfo *eai2;
+   Eina_List *l, *ll;
+
    EINA_SAFETY_ON_NULL_RETURN_VAL(eai, EINA_FALSE);
    EINA_SAFETY_ON_TRUE_RETURN_VAL(pid <= 0, EINA_FALSE);
 
+   // find appinfo with same pid
+   EINA_LIST_FOREACH_SAFE(appinfo_list, l, ll, eai2)
+     {
+        if (eai2->pid == pid)
+          {
+             if (eai2 != eai)
+               {
+                  ELOGF("POL_APPINFO", "removed duplicated appinfo, eai1(%p), eai2(%p)", NULL, eai, eai2);
+                  if (eai2->appid && e_util_strcmp(eai2->appid, eai->appid))
+                    ELOGF("POL_APPINFO","duplicated appinfo with separated appid", NULL);
+
+                  // duplicated appinfo. merge it!
+                  if (!eai->appid) eai->appid = eina_stringshare_add(eai2->appid);
+                  if (!eai->base_output_available && eai2->base_output_available)
+                    {
+                       ELOGF("POL_APPINFO", "copy base_output variable into appinfo, eai1(%p) <- eai2(%p)", NULL, eai, eai2);
+                       eai->base_output_available = eai2->base_output_available;
+                       eai->base_output_width = eai2->base_output_width;
+                       eai->base_output_height = eai2->base_output_height;
+                    }
+                  e_appinfo_del(eai2);
+               }
+          }
+     }
+
    eai->pid = pid;
 
    ELOGF("POL_APPINFO", "appinfo(%p) set pid(%u)", NULL, eai, pid);
@@ -114,9 +142,37 @@ e_appinfo_pid_set(E_Appinfo *eai, pid_t pid)
 EINTERN Eina_Bool
 e_appinfo_appid_set(E_Appinfo *eai, const char *appid)
 {
+   E_Appinfo *eai2;
+   Eina_List *l;
+
    EINA_SAFETY_ON_NULL_RETURN_VAL(eai, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(appid, EINA_FALSE);
 
+   // find appinfo with same appid
+   EINA_LIST_FOREACH(appinfo_list, l, eai2)
+     {
+        if (!e_util_strcmp(eai2->appid, appid))
+          {
+             if (eai2 != eai)
+               {
+                  ELOGF("POL_APPINFO", "removed duplicated appinfo, eai1(%p), eai2(%p)", NULL, eai, eai2);
+                  if ((eai2->pid > 0) && (eai2->pid != eai->pid))
+                    ELOGF("POL_APPINFO", "duplicated appinfo with separated pid", NULL);
+
+                  // duplicated appinfo. merge it!
+                  if (!eai->pid) eai->pid = eai2->pid;
+                  if (!eai->base_output_available && eai2->base_output_available)
+                    {
+                       ELOGF("POL_APPINFO", "copy base_output variable into appinfo, eai1(%p) <- eai2(%p)", NULL, eai, eai2);
+                       eai->base_output_available = eai2->base_output_available;
+                       eai->base_output_width = eai2->base_output_width;
+                       eai->base_output_height = eai2->base_output_height;
+                    }
+                  e_appinfo_del(eai2);
+               }
+          }
+     }
+
    if (eai->appid)
      eina_stringshare_del(eai->appid);