discomfitor pushed a commit to branch enlightenment-0.18. http://git.enlightenment.org/core/enlightenment.git/commit/?id=bc58bc39e25d0db2322962a06bdeafc9579c5a5c
commit bc58bc39e25d0db2322962a06bdeafc9579c5a5c Author: Mike Blumenkrantz <[email protected]> Date: Wed Feb 5 20:52:55 2014 -0500 bugfix: race condition when deleting clients and their e_exec this occurred occasionally when a client was the last one on a phony exe --- src/bin/e_exec.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/bin/e_exec.c b/src/bin/e_exec.c index eb0a5d1..0c3f5b9 100644 --- a/src/bin/e_exec.c +++ b/src/bin/e_exec.c @@ -51,6 +51,7 @@ static E_Exec_Instance *_e_exec_cb_exec(void *data, Efreet_Desktop *desktop, cha static Eina_Bool _e_exec_cb_expire_timer(void *data); static Eina_Bool _e_exec_cb_exit(void *data, int type, void *event); static void _e_exec_cb_exec_new_free(void *data, void *event); +static void _e_exec_cb_exec_new_client_free(void *data, void *ev); static void _e_exec_cb_exec_del_free(void *data, void *event); static void _e_exe_instance_watchers_call(E_Exec_Instance *inst, E_Exec_Watch_Type type); static Eina_Bool _e_exec_startup_id_pid_find(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *value, void *data); @@ -346,10 +347,11 @@ e_exec_instance_found(E_Exec_Instance *inst) EAPI void e_exec_instance_client_add(E_Exec_Instance *inst, E_Border *bd) { + e_object_ref(E_OBJECT(bd)); inst->borders = eina_list_append(inst->borders, bd); bd->exe_inst = inst; inst->ref++; - ecore_event_add(E_EVENT_EXEC_NEW_CLIENT, inst, _e_exec_cb_exec_new_free, inst); + ecore_event_add(E_EVENT_EXEC_NEW_CLIENT, inst, _e_exec_cb_exec_new_client_free, bd); } EAPI void @@ -649,6 +651,7 @@ _e_exec_instance_free(E_Exec_Instance *inst) if (!inst->deleted) { inst->deleted = 1; + E_LIST_FOREACH(inst->borders, e_object_ref); ecore_event_add(E_EVENT_EXEC_DEL, inst, _e_exec_cb_exec_del_free, inst); return; } @@ -657,7 +660,10 @@ _e_exec_instance_free(E_Exec_Instance *inst) inst->desktop); if (inst->expire_timer) ecore_timer_del(inst->expire_timer); EINA_LIST_FREE(inst->borders, bd) - bd->exe_inst = NULL; + { + bd->exe_inst = NULL; + e_object_unref(E_OBJECT(bd)); + } if (inst->desktop) efreet_desktop_free(inst->desktop); if (inst->exe) ecore_exe_data_set(inst->exe, NULL); free(inst); @@ -673,6 +679,16 @@ _e_exec_instance_free(E_Exec_Instance *inst) */ static void +_e_exec_cb_exec_new_client_free(void *data, void *ev) +{ + E_Exec_Instance *inst = ev; + + inst->ref--; + _e_exec_instance_free(inst); + e_object_unref(data); +} + +static void _e_exec_cb_exec_new_free(void *data, void *ev EINA_UNUSED) { E_Exec_Instance *inst = data; --
