From 1cee87f66b1051a3ac4e47091a579a93dabfc725 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Tue, 6 Dec 2016 11:27:37 +0900 Subject: [PATCH] eldbus: change to idle_enterer from idler Summary: This patch set changes eldbus to use idle_enterer from idler. If an application does not give idle time, then the eldbus cannot have chance to work. Reviewers: raster, cedric Subscribers: jpeg Differential Revision: https://phab.enlightenment.org/D4443 Change-Id: I83719dd9b97002beb998bc4db2d789254c3a2c74 --- src/lib/eldbus/eldbus_core.c | 47 ++++++++++++++++++++--------------- src/lib/eldbus/eldbus_private_types.h | 6 ++--- src/lib/eldbus/eldbus_service.c | 46 +++++++++++++++++----------------- 3 files changed, 53 insertions(+), 46 deletions(-) diff --git a/src/lib/eldbus/eldbus_core.c b/src/lib/eldbus/eldbus_core.c index cf149cd..7e7b27d 100644 --- a/src/lib/eldbus/eldbus_core.c +++ b/src/lib/eldbus/eldbus_core.c @@ -45,7 +45,7 @@ typedef struct _Eldbus_Connection_Context_NOC_Cb Eldbus_Name_Owner_Changed_Cb cb; const void *cb_data; Eina_Bool deleted : 1; - Ecore_Idler *idler; + Ecore_Idle_Enterer *idle_enterer; Eina_Bool allow_initial : 1; } Eldbus_Connection_Context_NOC_Cb; @@ -756,7 +756,7 @@ cb_timeout_toggle(DBusTimeout *timeout, void *data EINA_UNUSED) } static Eina_Bool -eldbus_idler(void *data) +eldbus_idle_enterer(void *data) { Eldbus_Connection *conn = data; @@ -766,15 +766,22 @@ eldbus_idler(void *data) if (dbus_connection_get_dispatch_status(conn->dbus_conn) == DBUS_DISPATCH_COMPLETE) { - DBG("Connection@%p: Dispatch complete, idler@%p finishing", - conn, conn->idler); - conn->idler = NULL; + DBG("Connection@%p: Dispatch complete, idle_enterer@%p finishing", + conn, conn->idle_enterer); + conn->idle_enterer = NULL; return ECORE_CALLBACK_CANCEL; } DBG("Connection@%p: Dispatching", conn); eldbus_init(); eldbus_connection_ref(conn); - dbus_connection_dispatch(conn->dbus_conn); + + DBusDispatchStatus status; + do + { + status = dbus_connection_dispatch(conn->dbus_conn); + } + while(status == DBUS_DISPATCH_DATA_REMAINS); + eldbus_connection_unref(conn); eldbus_shutdown(); return ECORE_CALLBACK_RENEW; @@ -793,19 +800,19 @@ cb_dispatch_status(DBusConnection *dbus_conn EINA_UNUSED, DBusDispatchStatus new DBG("Connection@%p: Dispatch status: %d", conn, new_status); - if ((new_status == DBUS_DISPATCH_DATA_REMAINS) && (!conn->idler)) + if ((new_status == DBUS_DISPATCH_DATA_REMAINS) && (!conn->idle_enterer)) { - conn->idler = ecore_idler_add(eldbus_idler, conn); - DBG("Connection@%p: Adding idler@%p to handle remaining dispatch data", - conn, conn->idler); + conn->idle_enterer = ecore_idle_enterer_add(eldbus_idle_enterer, conn); + DBG("Connection@%p: Adding idle_enterer@%p to handle remaining dispatch data", + conn, conn->idle_enterer); } - else if ((new_status != DBUS_DISPATCH_DATA_REMAINS) && (conn->idler)) + else if ((new_status != DBUS_DISPATCH_DATA_REMAINS) && (conn->idle_enterer)) { - DBG("Connection@%p: No remaining dispatch data, clearing idler@%p", - conn, conn->idler); + DBG("Connection@%p: No remaining dispatch data, clearing idle_enterer@%p", + conn, conn->idle_enterer); - ecore_idler_del(conn->idler); - conn->idler = NULL; + ecore_idle_enterer_del(conn->idle_enterer); + conn->idle_enterer = NULL; } } @@ -1232,7 +1239,7 @@ _eldbus_connection_free(Eldbus_Connection *conn) eldbus_data_del_all(&conn->data); - if (conn->idler) ecore_idler_del(conn->idler); + if (conn->idle_enterer) ecore_idle_enterer_del(conn->idle_enterer); if (conn->type && conn->shared) { if (conn->type == ELDBUS_CONNECTION_TYPE_ADDRESS) @@ -1330,7 +1337,7 @@ dispach_name_owner_cb(void *context) dispatch_name_owner_data *data = context; data->ctx->cb((void *)data->ctx->cb_data, data->cn->name, "", data->cn->unique_id); - data->ctx->idler = NULL; + data->ctx->idle_enterer = NULL; free(data); return ECORE_CALLBACK_CANCEL; } @@ -1362,7 +1369,7 @@ eldbus_name_owner_changed_callback_add(Eldbus_Connection *conn, const char *bus, EINA_SAFETY_ON_NULL_RETURN(dispatch_data); dispatch_data->cn = cn; dispatch_data->ctx = ctx; - ctx->idler = ecore_idler_add(dispach_name_owner_cb, dispatch_data); + ctx->idle_enterer = ecore_idle_enterer_add(dispach_name_owner_cb, dispatch_data); } return; @@ -1405,10 +1412,10 @@ eldbus_name_owner_changed_callback_del(Eldbus_Connection *conn, const char *bus, cn->event_handlers.list = eina_inlist_remove(cn->event_handlers.list, EINA_INLIST_GET(found)); - if (found->idler) + if (found->idle_enterer) { dispatch_name_owner_data *data; - data = ecore_idler_del(found->idler); + data = ecore_idle_enterer_del(found->idle_enterer); free(data); } free(found); diff --git a/src/lib/eldbus/eldbus_private_types.h b/src/lib/eldbus/eldbus_private_types.h index 7af9426..05dfee8 100644 --- a/src/lib/eldbus/eldbus_private_types.h +++ b/src/lib/eldbus/eldbus_private_types.h @@ -54,7 +54,7 @@ struct _Eldbus_Connection Eina_Inlist *pendings; Eina_Inlist *fd_handlers; Eina_Inlist *timeouts; - Ecore_Idler *idler; + Ecore_Idle_Enterer *idle_enterer; Eldbus_Connection_Context_Event event_handlers[ELDBUS_CONNECTION_EVENT_LAST]; Eina_Inlist *root_objs;//service_object Eldbus_Proxy *fdo_proxy; @@ -153,7 +153,7 @@ struct _Eldbus_Service_Object Eldbus_Service_Interface *objmanager; Eina_List *iface_added; Eina_List *iface_removed; - Ecore_Idler *idler_iface_changed; + Ecore_Idle_Enterer *idle_enterer_iface_changed; }; struct _Eldbus_Service_Interface @@ -167,7 +167,7 @@ struct _Eldbus_Service_Interface Eina_Hash *properties; Eldbus_Property_Set_Cb set_func; Eldbus_Property_Get_Cb get_func; - Ecore_Idler *idler_propschanged; + Ecore_Idle_Enterer *idle_enterer_propschanged; Eina_Array *props_changed; Eina_Array *prop_invalidated; }; diff --git a/src/lib/eldbus/eldbus_service.c b/src/lib/eldbus/eldbus_service.c index 9fdcdd5..39f2a29 100644 --- a/src/lib/eldbus/eldbus_service.c +++ b/src/lib/eldbus/eldbus_service.c @@ -784,7 +784,7 @@ _object_manager_changes_process(void *data) Eldbus_Service_Object *obj = data; Eldbus_Service_Object *parent = _object_manager_parent_find(obj); - obj->idler_iface_changed = NULL; + obj->idle_enterer_iface_changed = NULL; if (!parent) { @@ -823,8 +823,8 @@ _eldbus_service_interface_add(Eldbus_Service_Object *obj, const char *interface) iface->obj = obj; eina_hash_add(obj->interfaces, iface->name, iface); - if (!obj->idler_iface_changed) - obj->idler_iface_changed = ecore_idler_add(_object_manager_changes_process, + if (!obj->idle_enterer_iface_changed) + obj->idle_enterer_iface_changed = ecore_idle_enterer_add(_object_manager_changes_process, obj); obj->iface_added = eina_list_append(obj->iface_added, iface); @@ -1016,7 +1016,7 @@ eldbus_service_interface_fallback_register2(Eldbus_Connection *conn, const char } static Eina_Bool -_idler_propschanged(void *data) +_idle_enterer_propschanged(void *data) { Eldbus_Service_Interface *iface = data; Eldbus_Message *msg; @@ -1024,7 +1024,7 @@ _idler_propschanged(void *data) Eina_Hash *added = NULL; Property *prop; - iface->idler_propschanged = NULL; + iface->idle_enterer_propschanged = NULL; added = eina_hash_string_small_new(NULL); msg = eldbus_message_signal_new(iface->obj->path, properties_iface->name, @@ -1128,10 +1128,10 @@ _interface_free(Eldbus_Service_Interface *interface) /** * flush props changes before remove interface */ - if (interface->idler_propschanged) + if (interface->idle_enterer_propschanged) { - ecore_idler_del(interface->idler_propschanged); - _idler_propschanged(interface); + ecore_idle_enterer_del(interface->idle_enterer_propschanged); + _idle_enterer_propschanged(interface); } eina_hash_free(interface->methods); @@ -1151,17 +1151,17 @@ _interface_free(Eldbus_Service_Interface *interface) /* Adding and removing the interface in the same main loop iteration. * Let's not send any signal */ obj->iface_added = eina_list_remove_list(obj->iface_added, l); - if (!obj->iface_added && !obj->iface_removed && obj->idler_iface_changed) + if (!obj->iface_added && !obj->iface_removed && obj->idle_enterer_iface_changed) { - ecore_idler_del(obj->idler_iface_changed); - obj->idler_iface_changed = NULL; + ecore_idle_enterer_del(obj->idle_enterer_iface_changed); + obj->idle_enterer_iface_changed = NULL; } } else { - if (!obj->idler_iface_changed) + if (!obj->idle_enterer_iface_changed) { - obj->idler_iface_changed = ecore_idler_add( + obj->idle_enterer_iface_changed = ecore_idle_enterer_add( _object_manager_changes_process, obj); } @@ -1188,9 +1188,9 @@ static void _children_ifaces_add_removed_flush(Eldbus_Service_Object *obj) _children_ifaces_add_removed_flush(children); } - if (obj->idler_iface_changed) + if (obj->idle_enterer_iface_changed) { - ecore_idler_del(obj->idler_iface_changed); + ecore_idle_enterer_del(obj->idle_enterer_iface_changed); _object_manager_changes_process(obj); } } @@ -1221,9 +1221,9 @@ _object_free(Eldbus_Service_Object *obj) * Flush our iface_add/removed if this object are * children of some other path with ObjectManager */ - if (obj->idler_iface_changed) + if (obj->idle_enterer_iface_changed) { - ecore_idler_del(obj->idler_iface_changed); + ecore_idle_enterer_del(obj->idle_enterer_iface_changed); _object_manager_changes_process(obj); } @@ -1482,8 +1482,8 @@ eldbus_service_property_changed(const Eldbus_Service_Interface *interface, const prop = eina_hash_find(iface->properties, name); EINA_SAFETY_ON_NULL_RETURN_VAL(prop, EINA_FALSE); - if (!iface->idler_propschanged) - iface->idler_propschanged = ecore_idler_add(_idler_propschanged, iface); + if (!iface->idle_enterer_propschanged) + iface->idle_enterer_propschanged = ecore_idle_enterer_add(_idle_enterer_propschanged, iface); if (!iface->props_changed) iface->props_changed = eina_array_new(1); @@ -1507,8 +1507,8 @@ eldbus_service_property_invalidate_set(const Eldbus_Service_Interface *interface prop->is_invalidate = is_invalidate; - if (!iface->idler_propschanged) - iface->idler_propschanged = ecore_idler_add(_idler_propschanged, iface); + if (!iface->idle_enterer_propschanged) + iface->idle_enterer_propschanged = ecore_idle_enterer_add(_idle_enterer_propschanged, iface); if (is_invalidate) { @@ -1546,8 +1546,8 @@ eldbus_service_object_manager_attach(Eldbus_Service_Interface *iface) * with path equal to our path rather than from the previous * ObjectManager */ - if (obj->idler_iface_changed) - ecore_idler_del(obj->idler_iface_changed); + if (obj->idle_enterer_iface_changed) + ecore_idle_enterer_del(obj->idle_enterer_iface_changed); _object_manager_changes_process(obj); obj->objmanager = objmanager; -- 2.7.4