etrunko pushed a commit to branch master.

http://git.enlightenment.org/legacy/eldbus.git/commit/?id=5022c1dbe783173e3d9f4c3768ed37a906707a89

commit 5022c1dbe783173e3d9f4c3768ed37a906707a89
Author: José Roberto de Souza <jose.so...@intel.com>
Date:   Mon Aug 26 16:11:31 2013 -0300

    eldbus: Handle correclty the last unref of a object path or conn in service 
callback
    
    This allow user remove the last reference of service object path or last
    last reference of connection be removed inside of a method callback.
---
 src/lib/eldbus_service.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/lib/eldbus_service.c b/src/lib/eldbus_service.c
index 490b045..4c793c8 100644
--- a/src/lib/eldbus_service.c
+++ b/src/lib/eldbus_service.c
@@ -1264,16 +1264,17 @@ _object_unregister(DBusConnection *conn EINA_UNUSED, 
void *user_data)
 }
 
 static DBusHandlerResult
-_object_handler(DBusConnection *conn EINA_UNUSED, DBusMessage *msg, void 
*user_data)
+_object_handler(DBusConnection *dbus_conn EINA_UNUSED, DBusMessage *msg, void 
*user_data)
 {
    Eldbus_Service_Object *obj;
    Eldbus_Service_Interface *iface;
    const Eldbus_Method *method;
-   Eldbus_Message *eldbus_msg;
-   Eldbus_Message *reply;
+   Eldbus_Message *eldbus_msg, *reply;
+   Eldbus_Connection *conn;
 
    obj = user_data;
    if (!obj) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+   conn = obj->conn;
 
    DBG("Connection@%p Got message:\n"
           "  Type: %s\n"
@@ -1299,6 +1300,9 @@ _object_handler(DBusConnection *conn EINA_UNUSED, 
DBusMessage *msg, void *user_d
    dbus_message_ref(eldbus_msg->dbus_msg);
    dbus_message_iter_init(eldbus_msg->dbus_msg, 
&eldbus_msg->iterator->dbus_iterator);
 
+   eldbus_init();
+   eldbus_connection_ref(conn);
+
    if (!_have_signature(method->in, eldbus_msg))
      reply = eldbus_message_error_new(eldbus_msg, DBUS_ERROR_INVALID_SIGNATURE,
                                       "See introspectable to know the expected 
signature");
@@ -1318,7 +1322,10 @@ _object_handler(DBusConnection *conn EINA_UNUSED, 
DBusMessage *msg, void *user_d
 
    eldbus_message_unref(eldbus_msg);
    if (reply)
-     _eldbus_connection_send(obj->conn, reply, NULL, NULL, -1);
+     _eldbus_connection_send(conn, reply, NULL, NULL, -1);
+
+   eldbus_connection_unref(conn);
+   eldbus_shutdown();
 
    return DBUS_HANDLER_RESULT_HANDLED;
 }

-- 


Reply via email to