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;

-- 


Reply via email to