From d5dab6de7bc124a7cc4caf3a2968931efb59fe5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Tue, 11 Dec 2012 19:49:42 +0000 Subject: [PATCH] edbus: Handle 'unref signal handler inside of own callback' with ref and unref MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This way is much simpler and doesn't generate many events when main loop is quit inside of a signal handler callback. Patch by: José Roberto de Souza SVN revision: 80683 --- legacy/edbus/src/lib/edbus_core.c | 10 ++++++++-- legacy/edbus/src/lib/edbus_private_types.h | 1 - legacy/edbus/src/lib/edbus_signal_handler.c | 19 ++----------------- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/legacy/edbus/src/lib/edbus_core.c b/legacy/edbus/src/lib/edbus_core.c index c5e858ee88..7a14ed0c22 100644 --- a/legacy/edbus/src/lib/edbus_core.c +++ b/legacy/edbus/src/lib/edbus_core.c @@ -824,6 +824,7 @@ cb_signal_dispatcher(EDBus_Connection *conn, DBusMessage *msg) char *arg_msg; EDBus_Message *edbus_msg; Signal_Argument *arg; + Eina_Inlist *safe_list; edbus_msg = edbus_message_new(EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN(edbus_msg); @@ -831,10 +832,12 @@ cb_signal_dispatcher(EDBus_Connection *conn, DBusMessage *msg) edbus_msg->dbus_msg = dbus_message_ref(msg); dbus_message_iter_init(edbus_msg->dbus_msg, &edbus_msg->iterator->dbus_iterator); - conn->running_signal = EINA_TRUE; + edbus_connection_ref(conn); EINA_INLIST_FOREACH(conn->signal_handlers, sh) { + sh->refcount++; + if (sh->dangling) continue; if (sh->sender) { if (sh->bus) @@ -877,8 +880,11 @@ next_sh: type = 0; } + EINA_INLIST_FOREACH_SAFE(conn->signal_handlers, safe_list, sh) + edbus_signal_handler_unref(sh); + edbus_message_unref(edbus_msg); - conn->running_signal = EINA_FALSE; + edbus_connection_unref(conn); } static DBusHandlerResult diff --git a/legacy/edbus/src/lib/edbus_private_types.h b/legacy/edbus/src/lib/edbus_private_types.h index ba810ea097..1c7b3b30be 100644 --- a/legacy/edbus/src/lib/edbus_private_types.h +++ b/legacy/edbus/src/lib/edbus_private_types.h @@ -59,7 +59,6 @@ struct _EDBus_Connection Eina_Inlist *fd_handlers; Eina_Inlist *timeouts; Ecore_Idler *idler; - Eina_Bool running_signal; EDBus_Connection_Context_Event event_handlers[EDBUS_CONNECTION_EVENT_LAST]; Eina_Inlist *root_objs;//service_object }; diff --git a/legacy/edbus/src/lib/edbus_signal_handler.c b/legacy/edbus/src/lib/edbus_signal_handler.c index 4ebe303fff..ec45adf561 100644 --- a/legacy/edbus/src/lib/edbus_signal_handler.c +++ b/legacy/edbus/src/lib/edbus_signal_handler.c @@ -206,14 +206,6 @@ cleanup_create_strbuf: return NULL; } -static Eina_Bool -signal_handler_deleter(void *data) -{ - EDBus_Signal_Handler *handler = data; - _edbus_signal_handler_del(handler); - return ECORE_CALLBACK_CANCEL; -} - static void _edbus_signal_handler_clean(EDBus_Signal_Handler *handler) { @@ -221,10 +213,6 @@ _edbus_signal_handler_clean(EDBus_Signal_Handler *handler) if (handler->dangling) return; - edbus_connection_signal_handler_del(handler->conn, handler); - if (handler->bus) - edbus_connection_name_owner_monitor(handler->conn, handler->bus, - EINA_FALSE); dbus_error_init(&err); dbus_bus_remove_match(handler->conn->dbus_conn, eina_strbuf_string_get(handler->match), &err); @@ -239,6 +227,7 @@ _edbus_signal_handler_del(EDBus_Signal_Handler *handler) DBG("handler %p, refcount=%d, conn=%p %s", handler, handler->refcount, handler->conn, handler->sender); edbus_cbs_free_dispatch(&(handler->cbs_free), handler); + edbus_connection_signal_handler_del(handler->conn, handler); EINA_MAGIC_SET(handler, EINA_MAGIC_NONE); /* after cbs_free dispatch these shouldn't exit, error if they do */ @@ -277,11 +266,7 @@ edbus_signal_handler_unref(EDBus_Signal_Handler *handler) if (handler->refcount > 0) return; _edbus_signal_handler_clean(handler); - - if (handler->conn->running_signal) - ecore_idler_add(signal_handler_deleter, handler); - else - _edbus_signal_handler_del(handler); + _edbus_signal_handler_del(handler); } EAPI void