wl: clean up tzsh server / client objects when removing tzsh object 38/45738/1
authorGwanglim Lee <gl77.lee@samsung.com>
Tue, 11 Aug 2015 04:18:36 +0000 (13:18 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 11 Aug 2015 04:18:36 +0000 (13:18 +0900)
and add object validation check to tzsh service / client request functions

Change-Id: I694a1cc21b74a8cb14a8ded8bfee10c47eade099

src/e_mod_wl.c

index a2167a3..271a145 100644 (file)
@@ -80,18 +80,24 @@ typedef struct _Pol_Wl
 
    /* tizen_ws_shell_interface */
    Eina_List       *tzshs;                   /* list of Pol_Wl_Tzsh */
-   Pol_Wl_Tzsh_Srv *srvs[TZSH_SRV_ROLE_MAX]; /* list of Pol_Wl_Tzsh_Srv */
-   Eina_List       *tvsrv_bind_list;         /* list of Pol_Wl_Tzsh_Client */
+   Eina_List       *tzsh_srvs;               /* list of Pol_Wl_Tzsh_Srv */
+   Eina_List       *tzsh_clients;            /* list of Pol_Wl_Tzsh_Client */
+   Pol_Wl_Tzsh_Srv *srvs[TZSH_SRV_ROLE_MAX]; /* list of registered Pol_Wl_Tzsh_Srv */
+   Eina_List       *tvsrv_bind_list;         /* list of activated Pol_Wl_Tzsh_Client */
 } Pol_Wl;
 
 static Pol_Wl *polwl = NULL;
 
-static void      _pol_wl_surf_del(Pol_Wl_Surface *psurf);
-static void      _pol_wl_tzsh_srv_register_handle(Pol_Wl_Tzsh_Srv *tzsh_srv);
-static void      _pol_wl_tzsh_srv_unregister_handle(Pol_Wl_Tzsh_Srv *tzsh_srv);
-static void      _pol_wl_tzsh_srv_state_broadcast(Pol_Wl_Tzsh_Srv *tzsh_srv, Eina_Bool reg);
-static void      _pol_wl_tzsh_srv_tvsrv_bind_update(void);
-static Eina_Bool _pol_wl_e_client_is_valid(E_Client *ec);
+static void                _pol_wl_surf_del(Pol_Wl_Surface *psurf);
+static void                _pol_wl_tzsh_srv_register_handle(Pol_Wl_Tzsh_Srv *tzsh_srv);
+static void                _pol_wl_tzsh_srv_unregister_handle(Pol_Wl_Tzsh_Srv *tzsh_srv);
+static void                _pol_wl_tzsh_srv_state_broadcast(Pol_Wl_Tzsh_Srv *tzsh_srv, Eina_Bool reg);
+static void                _pol_wl_tzsh_srv_tvsrv_bind_update(void);
+static Eina_Bool           _pol_wl_e_client_is_valid(E_Client *ec);
+static Pol_Wl_Tzsh_Srv    *_pol_wl_tzsh_srv_add(Pol_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_resource *res_tzsh_srv, const char *name);
+static void                _pol_wl_tzsh_srv_del(Pol_Wl_Tzsh_Srv *tzsh_srv);
+static Pol_Wl_Tzsh_Client *_pol_wl_tzsh_client_add(Pol_Wl_Tzsh *tzsh, struct wl_resource *res_tzsh_client);
+static void                _pol_wl_tzsh_client_del(Pol_Wl_Tzsh_Client *tzsh_client);
 
 // --------------------------------------------------------
 // Pol_Wl_Tzpol
@@ -210,14 +216,35 @@ _pol_wl_tzsh_add(struct wl_resource *res_tzsh)
 static void
 _pol_wl_tzsh_del(Pol_Wl_Tzsh *tzsh)
 {
+   Pol_Wl_Tzsh_Srv *tzsh_srv;
+   Pol_Wl_Tzsh_Client *tzsh_client;
+   Eina_List *l, *ll;
+
    polwl->tzshs = eina_list_remove(polwl->tzshs, tzsh);
 
+   if (tzsh->type == TZSH_TYPE_SRV)
+     {
+        EINA_LIST_FOREACH_SAFE(polwl->tzsh_srvs, l, ll, tzsh_srv)
+          {
+             if (tzsh_srv->tzsh != tzsh) continue;
+             _pol_wl_tzsh_srv_del(tzsh_srv);
+             break;
+          }
+     }
+   else
+     {
+        EINA_LIST_FOREACH_SAFE(polwl->tzsh_clients, l, ll, tzsh_client)
+          {
+             if (tzsh_client->tzsh != tzsh) continue;
+             _pol_wl_tzsh_client_del(tzsh_client);
+             break;
+          }
+     }
+
    ELOGF("TZSH",
          "LIST_DEL |tzsh:0x%08x",
          NULL, NULL, (unsigned int)tzsh);
 
-   /* TODO: clean up all child objects: srv, client, region ... */
-
    memset(tzsh, 0x0, sizeof(Pol_Wl_Tzsh));
    E_FREE(tzsh);
 }
@@ -245,36 +272,60 @@ _pol_wl_tzsh_registered_srv_send(Pol_Wl_Tzsh *tzsh)
      }
 }
 
-static void
-_pol_wl_tzsh_client_set(E_Client *ec)
+static Pol_Wl_Tzsh *
+_pol_wl_tzsh_get_from_client(E_Client *ec)
 {
-   Pol_Wl_Tzsh *tzsh = NULL, *tzsh2;
-   Pol_Wl_Tzsh_Srv *tzsh_srv;
-   Pol_Wl_Tzsh_Client *tzsh_client;
+   Pol_Wl_Tzsh *tzsh = NULL;
    Eina_List *l;
 
-   EINA_LIST_FOREACH(polwl->tzshs, l, tzsh2)
+   EINA_LIST_FOREACH(polwl->tzshs, l, tzsh)
      {
-        if (tzsh2->cp == ec->pixmap)
+        if (tzsh->cp == ec->pixmap)
           {
-             if ((tzsh2->ec) &&
-                 (tzsh2->ec != ec))
+             if ((tzsh->ec) &&
+                 (tzsh->ec != ec))
                {
                   ELOGF("TZSH",
                         "CRI ERR!!|tzsh_cp:0x%08x|tzsh_ec:0x%08x|tzsh:0x%08x",
                         ec->pixmap, ec,
-                        (unsigned int)tzsh2->cp,
-                        (unsigned int)tzsh2->ec,
-                        (unsigned int)tzsh2);
+                        (unsigned int)tzsh->cp,
+                        (unsigned int)tzsh->ec,
+                        (unsigned int)tzsh);
                }
-             tzsh2->ec = ec;
-             tzsh = tzsh2;
-             break;
+
+             return tzsh;
           }
      }
 
+   return NULL;
+}
+
+static Pol_Wl_Tzsh_Client *
+_pol_wl_tzsh_client_get_from_tzsh(Pol_Wl_Tzsh *tzsh)
+{
+   Pol_Wl_Tzsh_Client *tzsh_client;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(polwl->tvsrv_bind_list, l, tzsh_client)
+     {
+        if (tzsh_client->tzsh == tzsh)
+          return tzsh_client;
+     }
+
+   return NULL;
+}
+
+static void
+_pol_wl_tzsh_client_set(E_Client *ec)
+{
+   Pol_Wl_Tzsh *tzsh, *tzsh2;
+   Pol_Wl_Tzsh_Srv *tzsh_srv;
+
+   tzsh = _pol_wl_tzsh_get_from_client(ec);
    if (!tzsh) return;
 
+   tzsh->ec = ec;
+
    if (tzsh->type == TZSH_TYPE_SRV)
      {
         tzsh_srv = polwl->srvs[TZSH_SRV_ROLE_TVSERVICE];
@@ -287,44 +338,22 @@ _pol_wl_tzsh_client_set(E_Client *ec)
      }
    else
      {
-        EINA_LIST_FOREACH(polwl->tvsrv_bind_list, l, tzsh_client)
-          {
-             if (tzsh_client->tzsh == tzsh)
-               _pol_wl_tzsh_srv_tvsrv_bind_update();
-          }
+        if (_pol_wl_tzsh_client_get_from_tzsh(tzsh))
+          _pol_wl_tzsh_srv_tvsrv_bind_update();
      }
 }
 
 static void
 _pol_wl_tzsh_client_unset(E_Client *ec)
 {
-   Pol_Wl_Tzsh *tzsh = NULL, *tzsh2;
+   Pol_Wl_Tzsh *tzsh, *tzsh2;
    Pol_Wl_Tzsh_Srv *tzsh_srv;
-   Pol_Wl_Tzsh_Client *tzsh_client;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(polwl->tzshs, l, tzsh2)
-     {
-        if (tzsh2->cp == ec->pixmap)
-          {
-             if ((tzsh2->ec) &&
-                 (tzsh2->ec != ec))
-               {
-                  ELOGF("TZSH",
-                        "CRI ERR!!|tzsh_cp:0x%08x|tzsh_ec:0x%08x|tzsh:0x%08x",
-                        ec->pixmap, ec,
-                        (unsigned int)tzsh2->cp,
-                        (unsigned int)tzsh2->ec,
-                        (unsigned int)tzsh2);
-               }
-             tzsh2->ec = NULL;
-             tzsh = tzsh2;
-             break;
-          }
-     }
 
+   tzsh = _pol_wl_tzsh_get_from_client(ec);
    if (!tzsh) return;
 
+   tzsh->ec = NULL;
+
    if (tzsh->type == TZSH_TYPE_SRV)
      {
         tzsh_srv = polwl->srvs[TZSH_SRV_ROLE_TVSERVICE];
@@ -337,11 +366,8 @@ _pol_wl_tzsh_client_unset(E_Client *ec)
      }
    else
      {
-        EINA_LIST_FOREACH(polwl->tvsrv_bind_list, l, tzsh_client)
-          {
-             if (tzsh_client->tzsh == tzsh)
-               _pol_wl_tzsh_srv_tvsrv_bind_update();
-          }
+        if (_pol_wl_tzsh_client_get_from_tzsh(tzsh))
+          _pol_wl_tzsh_srv_tvsrv_bind_update();
      }
 }
 
@@ -361,8 +387,6 @@ _pol_wl_tzsh_srv_add(Pol_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_resource *
    tzsh_srv->role = role;
    tzsh_srv->name = eina_stringshare_add(name);
 
-   polwl->srvs[role] = tzsh_srv;
-
    ELOGF("TZSH",
          "SRV_ADD  |res:0x%08x|tzsh_srv:0x%08x|name:%s",
          tzsh->cp, tzsh->ec,
@@ -370,6 +394,9 @@ _pol_wl_tzsh_srv_add(Pol_Wl_Tzsh *tzsh, Tzsh_Srv_Role role, struct wl_resource *
          (unsigned int)tzsh_srv,
          name);
 
+   polwl->srvs[role] = tzsh_srv;
+   polwl->tzsh_srvs = eina_list_append(polwl->tzsh_srvs, tzsh_srv);
+
    _pol_wl_tzsh_srv_register_handle(tzsh_srv);
    _pol_wl_tzsh_srv_state_broadcast(tzsh_srv, EINA_TRUE);
 
@@ -381,6 +408,8 @@ _pol_wl_tzsh_srv_del(Pol_Wl_Tzsh_Srv *tzsh_srv)
 {
    Pol_Wl_Tzsh *tzsh;
 
+   polwl->tzsh_srvs = eina_list_remove(polwl->tzsh_srvs, tzsh_srv);
+
    if (polwl->srvs[tzsh_srv->role] == tzsh_srv)
      polwl->srvs[tzsh_srv->role] = NULL;
 
@@ -570,6 +599,8 @@ _pol_wl_tzsh_client_add(Pol_Wl_Tzsh *tzsh, struct wl_resource *res_tzsh_client)
          (unsigned int)res_tzsh_client,
          (unsigned int)tzsh_client);
 
+   polwl->tzsh_clients = eina_list_append(polwl->tzsh_clients, tzsh_client);
+
    return tzsh_client;
 }
 
@@ -578,6 +609,9 @@ _pol_wl_tzsh_client_del(Pol_Wl_Tzsh_Client *tzsh_client)
 {
    if (!tzsh_client) return;
 
+   polwl->tzsh_clients = eina_list_remove(polwl->tzsh_clients, tzsh_client);
+   polwl->tvsrv_bind_list = eina_list_remove(polwl->tvsrv_bind_list, tzsh_client);
+
    ELOGF("TZSH",
          "CL_DEL   |res:0x%08x|tzsh_client:0x%08x",
          NULL, NULL,
@@ -1576,6 +1610,9 @@ _tzsh_srv_iface_cb_region_set(struct wl_client *client, struct wl_resource *res_
    tzsh_srv = wl_resource_get_user_data(res_tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
 
+   if (!eina_list_data_find(polwl->tzsh_srvs, tzsh_srv))
+     return;
+
    tzsh_reg = wl_resource_get_user_data(res_reg);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_reg);
 
@@ -1597,6 +1634,9 @@ _tzsh_cb_srv_destroy(struct wl_resource *res_tzsh_srv)
    tzsh_srv = wl_resource_get_user_data(res_tzsh_srv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_srv);
 
+   if (!eina_list_data_find(polwl->tzsh_srvs, tzsh_srv))
+     return;
+
    _pol_wl_tzsh_srv_del(tzsh_srv);
 }
 
@@ -1966,6 +2006,9 @@ _tzsh_tvsrv_iface_cb_bind(struct wl_client *client EINA_UNUSED, struct wl_resour
    tzsh_client = wl_resource_get_user_data(res_tzsh_tvsrv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
 
+   if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
+     return;
+
    polwl->tvsrv_bind_list = eina_list_append(polwl->tvsrv_bind_list, tzsh_client);
 
    _pol_wl_tzsh_srv_tvsrv_bind_update();
@@ -1979,6 +2022,9 @@ _tzsh_tvsrv_iface_cb_unbind(struct wl_client *client EINA_UNUSED, struct wl_reso
    tzsh_client = wl_resource_get_user_data(res_tzsh_tvsrv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
 
+   if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
+     return;
+
    polwl->tvsrv_bind_list = eina_list_remove(polwl->tvsrv_bind_list, tzsh_client);
 
    _pol_wl_tzsh_srv_tvsrv_bind_update();
@@ -1999,6 +2045,9 @@ _tzsh_cb_tvsrv_destroy(struct wl_resource *res_tzsh_tvsrv)
    tzsh_client = wl_resource_get_user_data(res_tzsh_tvsrv);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
 
+   if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
+     return;
+
    polwl->tvsrv_bind_list = eina_list_remove(polwl->tvsrv_bind_list, tzsh_client);
 
    _pol_wl_tzsh_srv_tvsrv_bind_update();