X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdbus%2Fmainloop.c;h=b90a8447c7066d1b01758df98c3fb18f57e8d70f;hb=432b300341618d46a27c4b035d84f081435ffdeb;hp=7f2d001e77e60adbc0339d383db37aa2f60d9d11;hpb=834efb672875447b3baba9f6ee7f101abc105913;p=platform%2Fupstream%2Fconnman.git diff --git a/gdbus/mainloop.c b/gdbus/mainloop.c old mode 100644 new mode 100755 index 7f2d001..b90a844 --- a/gdbus/mainloop.c +++ b/gdbus/mainloop.c @@ -2,7 +2,7 @@ * * D-Bus helper library * - * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2011 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify @@ -28,14 +28,8 @@ #include #include -#ifdef NEED_DBUS_WATCH_GET_UNIX_FD -#define dbus_watch_get_unix_fd dbus_watch_get_fd -#endif - #include "gdbus.h" -#define DISPATCH_TIMEOUT 0 - #define info(fmt...) #define error(fmt...) #define debug(fmt...) @@ -74,8 +68,6 @@ static gboolean message_dispatch(void *data) { DBusConnection *conn = data; - dbus_connection_ref(conn); - /* Dispatch messages */ while (dbus_connection_dispatch(conn) == DBUS_DISPATCH_DATA_REMAINS); @@ -88,24 +80,30 @@ static inline void queue_dispatch(DBusConnection *conn, DBusDispatchStatus status) { if (status == DBUS_DISPATCH_DATA_REMAINS) - g_timeout_add(DISPATCH_TIMEOUT, message_dispatch, conn); + g_idle_add(message_dispatch, dbus_connection_ref(conn)); } static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data) { struct watch_info *info = data; unsigned int flags = 0; - - dbus_connection_ref(info->conn); + DBusDispatchStatus status; + DBusConnection *conn; if (cond & G_IO_IN) flags |= DBUS_WATCH_READABLE; if (cond & G_IO_OUT) flags |= DBUS_WATCH_WRITABLE; if (cond & G_IO_HUP) flags |= DBUS_WATCH_HANGUP; if (cond & G_IO_ERR) flags |= DBUS_WATCH_ERROR; + /* Protect connection from being destroyed by dbus_watch_handle */ + conn = dbus_connection_ref(info->conn); + dbus_watch_handle(info->watch, flags); - dbus_connection_unref(info->conn); + status = dbus_connection_get_dispatch_status(conn); + queue_dispatch(conn, status); + + dbus_connection_unref(conn); return TRUE; } @@ -226,9 +224,6 @@ static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) static void remove_timeout(DBusTimeout *timeout, void *data) { - if (dbus_timeout_get_enabled(timeout)) - return; - /* will trigger timeout_handler_free() */ dbus_timeout_set_data(timeout, NULL, NULL); } @@ -327,6 +322,7 @@ DBusConnection *g_dbus_setup_private(DBusBusType type, const char *name, return NULL; if (setup_bus(conn, name, error) == FALSE) { + dbus_connection_close(conn); dbus_connection_unref(conn); return NULL; } @@ -347,8 +343,12 @@ gboolean g_dbus_request_name(DBusConnection *connection, const char *name, return FALSE; } - if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + if (error != NULL) + dbus_set_error(error, name, "Name already in use"); + return FALSE; + } return TRUE; }