Fix resource leaks 91/73791/2 accepted/tizen/common/20160616.151349 accepted/tizen/ivi/20160616.001732 accepted/tizen/mobile/20160616.001450 accepted/tizen/tv/20160616.001643 accepted/tizen/wearable/20160616.001544 submit/tizen/20160614.071928 submit/tizen/20160615.013934
authorJeongHyun Kang <jhyuni.kang@samsung.com>
Thu, 9 Jun 2016 11:28:44 +0000 (20:28 +0900)
committerJeongHyun Kang <jhyuni.kang@samsung.com>
Tue, 14 Jun 2016 02:24:50 +0000 (19:24 -0700)
Change-Id: Idb56c81654f9aefbf2ed3edcd772f77767741304

src/e_mod_keyrouter_conf.c
src/e_mod_main_wl.c
src/e_mod_main_wl.h

index 868eac6d9cade2e0fcb1ece65db52f1d55959a1e..d730db542b560234ccb5808e30d36474c27afa41 100644 (file)
@@ -37,9 +37,15 @@ e_keyrouter_conf_init(E_Keyrouter_Config_Data *kconfig)
 void
 e_keyrouter_conf_deinit(E_Keyrouter_Config_Data *kconfig)
 {
+   E_Keyrouter_Tizen_HWKey *kdata;
+
    if (kconfig->conf)
      {
-        E_FREE_LIST(kconfig->conf->KeyList, free);
+        EINA_LIST_FREE(kconfig->conf->KeyList, kdata)
+          {
+             eina_stringshare_del(kdata->name);
+             free(kdata);
+          }
         free(kconfig->conf);
      }
 
index 3e41088c0ffe00959535e09d3f8106c5ef2ca72d..34ce7218015fdaa8008956b65e30442f188e1f92 100644 (file)
@@ -599,7 +599,7 @@ static const struct tizen_keyrouter_interface _e_keyrouter_implementation = {
 static void
 _e_keyrouter_cb_destory(struct wl_resource *resource)
 {
-   /* TODO : destroy resources if exist */
+   krt->resources = eina_list_remove(krt->resources, resource);
 }
 
 /* tizen_keyrouter global object bind function */
@@ -620,6 +620,8 @@ _e_keyrouter_cb_bind(struct wl_client *client, void *data, uint32_t version, uin
         return;
      }
 
+   krt->resources = eina_list_append(krt->resources, resource);
+
    wl_resource_set_implementation(resource, &_e_keyrouter_implementation, krt_instance, _e_keyrouter_cb_destory);
 }
 
@@ -770,10 +772,54 @@ e_modapi_init(E_Module *m)
 E_API int
 e_modapi_shutdown(E_Module *m)
 {
+   int i;
+   Eina_List *l, *l_next;
    E_Keyrouter_Config_Data *kconfig = m->data;
+   struct wl_resource *resource;
+   struct wl_client *client;
+   struct wl_listener *destroy_listener;
+
    e_keyrouter_conf_deinit(kconfig);
+   E_FREE(kconfig);
+
    _e_keyrouter_deinit_handlers();
 
+   for (i = 0; i < krt->max_tizen_hwkeys+1; i++)
+     {
+        if (krt->HardKeys[i].keyname)
+          eina_stringshare_del(krt->HardKeys[i].keyname);
+     }
+   E_FREE(krt->HardKeys);
+
+   EINA_LIST_FOREACH_SAFE(krt->grab_client_list, l, l_next, client)
+     {
+        destroy_listener = wl_client_get_destroy_listener(client, _e_keyrouter_wl_client_cb_destroy);
+        if (destroy_listener)
+          {
+             wl_list_remove(&destroy_listener->link);
+             E_FREE(destroy_listener);
+          }
+        krt->grab_client_list = eina_list_remove(krt->grab_client_list, client);
+     }
+   EINA_LIST_FOREACH_SAFE(krt->grab_surface_list, l, l_next, resource)
+     {
+        destroy_listener = wl_resource_get_destroy_listener(resource, _e_keyrouter_wl_surface_cb_destroy);
+        if (destroy_listener)
+          {
+             wl_list_remove(&destroy_listener->link);
+             E_FREE(destroy_listener);
+          }
+        krt->grab_surface_list = eina_list_remove(krt->grab_surface_list, client);
+     }
+
+   EINA_LIST_FREE(krt->registered_window_list, resource);
+
+   EINA_LIST_FREE(krt->resources, resource)
+     wl_resource_destroy(resource);
+
+   wl_global_destroy(krt->global);
+   E_FREE(krt);
+
 #ifdef ENABLE_CYNARA
    if (krt->p_cynara) cynara_finish(krt->p_cynara);
 #endif
index c5de001912bb7d616711e0ae663a34c95d1472fc..d8159ab56dc7fe08dff6e5684d12e18ef76d7df1 100644 (file)
@@ -115,6 +115,7 @@ struct _E_Keyrouter
    struct wl_global *global;
    Ecore_Event_Filter *ef_handler;
    Eina_List *handlers;
+   Eina_List *resources;
 
    E_Keyrouter_Config_Data *conf;