edbus: Handle 'unref signal handler inside of own callback' with ref and unref
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 <zehortigoza@profusion.mobi> SVN revision: 80683
This commit is contained in:
parent
7115dfa939
commit
d5dab6de7b
|
@ -824,6 +824,7 @@ cb_signal_dispatcher(EDBus_Connection *conn, DBusMessage *msg)
|
||||||
char *arg_msg;
|
char *arg_msg;
|
||||||
EDBus_Message *edbus_msg;
|
EDBus_Message *edbus_msg;
|
||||||
Signal_Argument *arg;
|
Signal_Argument *arg;
|
||||||
|
Eina_Inlist *safe_list;
|
||||||
|
|
||||||
edbus_msg = edbus_message_new(EINA_FALSE);
|
edbus_msg = edbus_message_new(EINA_FALSE);
|
||||||
EINA_SAFETY_ON_NULL_RETURN(edbus_msg);
|
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);
|
edbus_msg->dbus_msg = dbus_message_ref(msg);
|
||||||
dbus_message_iter_init(edbus_msg->dbus_msg,
|
dbus_message_iter_init(edbus_msg->dbus_msg,
|
||||||
&edbus_msg->iterator->dbus_iterator);
|
&edbus_msg->iterator->dbus_iterator);
|
||||||
conn->running_signal = EINA_TRUE;
|
|
||||||
|
|
||||||
|
edbus_connection_ref(conn);
|
||||||
EINA_INLIST_FOREACH(conn->signal_handlers, sh)
|
EINA_INLIST_FOREACH(conn->signal_handlers, sh)
|
||||||
{
|
{
|
||||||
|
sh->refcount++;
|
||||||
|
if (sh->dangling) continue;
|
||||||
if (sh->sender)
|
if (sh->sender)
|
||||||
{
|
{
|
||||||
if (sh->bus)
|
if (sh->bus)
|
||||||
|
@ -877,8 +880,11 @@ next_sh:
|
||||||
type = 0;
|
type = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EINA_INLIST_FOREACH_SAFE(conn->signal_handlers, safe_list, sh)
|
||||||
|
edbus_signal_handler_unref(sh);
|
||||||
|
|
||||||
edbus_message_unref(edbus_msg);
|
edbus_message_unref(edbus_msg);
|
||||||
conn->running_signal = EINA_FALSE;
|
edbus_connection_unref(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DBusHandlerResult
|
static DBusHandlerResult
|
||||||
|
|
|
@ -59,7 +59,6 @@ struct _EDBus_Connection
|
||||||
Eina_Inlist *fd_handlers;
|
Eina_Inlist *fd_handlers;
|
||||||
Eina_Inlist *timeouts;
|
Eina_Inlist *timeouts;
|
||||||
Ecore_Idler *idler;
|
Ecore_Idler *idler;
|
||||||
Eina_Bool running_signal;
|
|
||||||
EDBus_Connection_Context_Event event_handlers[EDBUS_CONNECTION_EVENT_LAST];
|
EDBus_Connection_Context_Event event_handlers[EDBUS_CONNECTION_EVENT_LAST];
|
||||||
Eina_Inlist *root_objs;//service_object
|
Eina_Inlist *root_objs;//service_object
|
||||||
};
|
};
|
||||||
|
|
|
@ -206,14 +206,6 @@ cleanup_create_strbuf:
|
||||||
return NULL;
|
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
|
static void
|
||||||
_edbus_signal_handler_clean(EDBus_Signal_Handler *handler)
|
_edbus_signal_handler_clean(EDBus_Signal_Handler *handler)
|
||||||
{
|
{
|
||||||
|
@ -221,10 +213,6 @@ _edbus_signal_handler_clean(EDBus_Signal_Handler *handler)
|
||||||
|
|
||||||
if (handler->dangling) return;
|
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_error_init(&err);
|
||||||
dbus_bus_remove_match(handler->conn->dbus_conn,
|
dbus_bus_remove_match(handler->conn->dbus_conn,
|
||||||
eina_strbuf_string_get(handler->match), &err);
|
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",
|
DBG("handler %p, refcount=%d, conn=%p %s",
|
||||||
handler, handler->refcount, handler->conn, handler->sender);
|
handler, handler->refcount, handler->conn, handler->sender);
|
||||||
edbus_cbs_free_dispatch(&(handler->cbs_free), handler);
|
edbus_cbs_free_dispatch(&(handler->cbs_free), handler);
|
||||||
|
edbus_connection_signal_handler_del(handler->conn, handler);
|
||||||
EINA_MAGIC_SET(handler, EINA_MAGIC_NONE);
|
EINA_MAGIC_SET(handler, EINA_MAGIC_NONE);
|
||||||
|
|
||||||
/* after cbs_free dispatch these shouldn't exit, error if they do */
|
/* 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;
|
if (handler->refcount > 0) return;
|
||||||
|
|
||||||
_edbus_signal_handler_clean(handler);
|
_edbus_signal_handler_clean(handler);
|
||||||
|
_edbus_signal_handler_del(handler);
|
||||||
if (handler->conn->running_signal)
|
|
||||||
ecore_idler_add(signal_handler_deleter, handler);
|
|
||||||
else
|
|
||||||
_edbus_signal_handler_del(handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
|
Loading…
Reference in New Issue