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