summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-mainloop.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-04-09 22:15:05 +0000
committerHavoc Pennington <hp@redhat.com>2003-04-09 22:15:05 +0000
commit7caf646fdf595946eb28202e2df3f847d28c7151 (patch)
treea55a420bb416e4b4ff2e8a73616788c1f118c50e /dbus/dbus-mainloop.c
parent1708094c0e00ab433bb0a51981f8b77d24aee256 (diff)
2003-04-09 Havoc Pennington <hp@redhat.com>
* test/test-utils.c: use dispatch status function to fix this up * bus/connection.c (connection_watch_callback): don't dispatch from here (connection_timeout_callback): don't dispatch from here (bus_connections_setup_connection): set the dispatch status function (bus_connection_disconnected): unset it * dbus/dbus-mainloop.c (_dbus_loop_queue_dispatch): new function used to add a connection to be dispatched (_dbus_loop_iterate): do the dispatching at the end of each iteration * dbus/dbus-connection.c (dbus_connection_set_dispatch_status_function): new function allowing us to fix up main loop usage (_dbus_connection_last_unref): free all the various function user data (dbus_connection_dispatch): call the DispatchStatusFunction whenever this function returns (dbus_connection_handle_watch): call DispatchStatusFunction (dbus_connection_send_with_reply_and_block): call DispatchStatusFunction (reply_handler_timeout): call DispatchStatusFunction (dbus_connection_flush): call DispatchStatusFunction
Diffstat (limited to 'dbus/dbus-mainloop.c')
-rw-r--r--dbus/dbus-mainloop.c61
1 files changed, 59 insertions, 2 deletions
diff --git a/dbus/dbus-mainloop.c b/dbus/dbus-mainloop.c
index b1706fe7..0ad2618a 100644
--- a/dbus/dbus-mainloop.c
+++ b/dbus/dbus-mainloop.c
@@ -34,6 +34,7 @@ struct DBusLoop
int watch_count;
int timeout_count;
int depth; /**< number of recursive runs */
+ DBusList *need_dispatch;
};
typedef enum
@@ -199,6 +200,12 @@ _dbus_loop_unref (DBusLoop *loop)
loop->refcount -= 1;
if (loop->refcount == 0)
{
+ while (loop->need_dispatch)
+ {
+ DBusConnection *connection = _dbus_list_pop_first (&loop->need_dispatch);
+
+ dbus_connection_unref (connection);
+ }
dbus_free (loop);
}
@@ -399,13 +406,55 @@ check_timeout (unsigned long tv_sec,
return msec == 0;
}
+static void
+_dbus_loop_dispatch (DBusLoop *loop)
+{
+ next:
+ while (loop->need_dispatch != NULL)
+ {
+ DBusConnection *connection = _dbus_list_pop_first (&loop->need_dispatch);
+
+ while (TRUE)
+ {
+ DBusDispatchStatus status;
+
+ status = dbus_connection_dispatch (connection);
+
+ if (status == DBUS_DISPATCH_COMPLETE)
+ {
+ dbus_connection_unref (connection);
+ goto next;
+ }
+ else
+ {
+ if (status == DBUS_DISPATCH_NEED_MEMORY)
+ _dbus_wait_for_memory ();
+ }
+ }
+ }
+}
+
+dbus_bool_t
+_dbus_loop_queue_dispatch (DBusLoop *loop,
+ DBusConnection *connection)
+{
+
+ if (_dbus_list_append (&loop->need_dispatch, connection))
+ {
+ dbus_connection_ref (connection);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
/* Returns TRUE if we have any timeouts or ready file descriptors,
* which is just used in test code as a debug hack
*/
dbus_bool_t
_dbus_loop_iterate (DBusLoop *loop,
- dbus_bool_t block)
+ dbus_bool_t block)
{
dbus_bool_t retval;
DBusPollFD *fds;
@@ -553,7 +602,8 @@ _dbus_loop_iterate (DBusLoop *loop,
}
}
- if (!block)
+ /* Never block if we have stuff to dispatch */
+ if (!block || loop->need_dispatch != NULL)
{
timeout = 0;
#if 0
@@ -673,6 +723,12 @@ _dbus_loop_iterate (DBusLoop *loop,
dbus_free (fds);
dbus_free (watches_for_fds);
+ if (loop->need_dispatch != NULL)
+ {
+ retval = TRUE;
+ _dbus_loop_dispatch (loop);
+ }
+
return retval;
}
@@ -716,3 +772,4 @@ _dbus_wait_for_memory (void)
{
_dbus_sleep_milliseconds (_dbus_get_oom_wait ());
}
+