|
From: <enl...@li...> - 2006-03-04 22:33:14
|
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);
}
|