Enlightenment CVS committal

Author  : moom16
Project : e17
Module  : proto

Dir     : e17/proto/etk/src/lib


Modified Files:
        etk_signal.c 


Log Message:
* Stop calling callbacks if an object is destroyed by a callback when a signal 
is emitted


===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_signal.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -3 -r1.10 -r1.11
--- etk_signal.c        4 Mar 2006 19:48:20 -0000       1.10
+++ etk_signal.c        4 Mar 2006 22:33:10 -0000       1.11
@@ -302,7 +302,6 @@
  * @param return_value the location where we will put the return value (may be 
NULL)
  * @param args the arguments to pass to the callback function
  */
-/* TODO: Fixme the right way! */
 void etk_signal_emit_valist(Etk_Signal *signal, Etk_Object *object, void 
*return_value, va_list args)
 {
    Evas_List *callbacks;
@@ -310,17 +309,21 @@
    Etk_Bool return_value_set = ETK_FALSE;
    void *result = NULL;
    va_list args2;
+   void *object_ptr;
 
    if (!object || !signal)
       return;
 
+   /* The pointer object will be set to NULL if the object is destroyed by a 
callback */
+   object_ptr = object;
+   etk_object_weak_pointer_add(object, &object_ptr);
    _etk_signal_stop_emission = ETK_FALSE;
    va_copy(args2, args);
 
    /* We call the callbacks to call before the default handler */
    callbacks = NULL;
    etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_FALSE);
-   while (!_etk_signal_stop_emission && callbacks)
+   while (!_etk_signal_stop_emission && callbacks && object_ptr)
    {
       callback = callbacks->data;
       if (!return_value_set || !signal->accumulator)
@@ -336,8 +339,13 @@
       callbacks = evas_list_remove_list(callbacks, callbacks);
    }   
    
-   if (_etk_signal_stop_emission)
+   if (!object_ptr)
       return;
+   else if (_etk_signal_stop_emission)
+   {
+      etk_object_weak_pointer_remove(object, &object_ptr);
+      return;
+   }
 
    /* Calls the default handler */
    if (signal->default_handler_offset >= 0 && signal->marshaller)
@@ -360,12 +368,18 @@
       }
    }
 
-   if (_etk_signal_stop_emission)
+   if (!object_ptr)
+      return;
+   else if (_etk_signal_stop_emission)
+   {
+      etk_object_weak_pointer_remove(object, &object_ptr);
       return;
+   }
 
-   /* We call the callbacks to call after the default handler */callbacks = 
NULL;
+   /* We call the callbacks to call after the default handler */
+   callbacks = NULL;
    etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_TRUE);
-   while (!_etk_signal_stop_emission && callbacks)
+   while (!_etk_signal_stop_emission && callbacks && object_ptr)
    {
       callback = callbacks->data;
       if (!return_value_set || !signal->accumulator)
@@ -381,6 +395,9 @@
       callbacks = evas_list_remove_list(callbacks, callbacks);
    }
    
+   if (object_ptr)
+      etk_object_weak_pointer_remove(object, &object_ptr);
+   
    va_end(args2);
 }
 




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to