From: JeongHyun Kang Date: Thu, 9 Jun 2016 11:28:44 +0000 (+0900) Subject: Fix resource leaks X-Git-Tag: submit/tizen/20160614.071928^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ad998bbdfca27c36420f00602e590a8d0bac134d;p=platform%2Fcore%2Fuifw%2Fe-mod-tizen-keyrouter.git Fix resource leaks Change-Id: Idb56c81654f9aefbf2ed3edcd772f77767741304 --- diff --git a/src/e_mod_keyrouter_conf.c b/src/e_mod_keyrouter_conf.c index 868eac6..d730db5 100644 --- a/src/e_mod_keyrouter_conf.c +++ b/src/e_mod_keyrouter_conf.c @@ -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); } diff --git a/src/e_mod_main_wl.c b/src/e_mod_main_wl.c index 3e41088..34ce721 100644 --- a/src/e_mod_main_wl.c +++ b/src/e_mod_main_wl.c @@ -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 diff --git a/src/e_mod_main_wl.h b/src/e_mod_main_wl.h index c5de001..d8159ab 100644 --- a/src/e_mod_main_wl.h +++ b/src/e_mod_main_wl.h @@ -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;