diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | bus/Makefile.am | 2 | ||||
-rw-r--r-- | bus/activation.c | 30 | ||||
-rw-r--r-- | bus/bus.c | 27 | ||||
-rw-r--r-- | bus/bus.h | 5 | ||||
-rw-r--r-- | bus/connection.c | 25 | ||||
-rw-r--r-- | bus/dispatch.c | 11 | ||||
-rw-r--r-- | bus/loop.c | 698 | ||||
-rw-r--r-- | bus/loop.h | 65 | ||||
-rw-r--r-- | bus/main.c | 5 | ||||
-rw-r--r-- | bus/test.c | 35 | ||||
-rw-r--r-- | bus/utils.c | 20 | ||||
-rw-r--r-- | bus/utils.h | 3 | ||||
-rw-r--r-- | dbus/Makefile.am | 28 |
14 files changed, 100 insertions, 864 deletions
@@ -1,5 +1,15 @@ 2003-04-06 Havoc Pennington <hp@pobox.com> + * dbus/Makefile.am: split lists of sources into stuff that goes in + the library, util functions that go in the lib and are also used + elsewhere, and util functions that are used in tests/daemon but + don't go in the lib. + + * dbus/dbus-mainloop.h, dbus/dbus-mainloop.c: move bus/loop.[hc] + here so it can be used in test binaries also + +2003-04-06 Havoc Pennington <hp@pobox.com> + * dbus/dbus-sysdeps.c (_dbus_become_daemon): write the pidfile here in the parent process, so we can return an error if it fails. Also, move some of the code into the child so the parent diff --git a/bus/Makefile.am b/bus/Makefile.am index adbebaeb..85f47ddc 100644 --- a/bus/Makefile.am +++ b/bus/Makefile.am @@ -40,8 +40,6 @@ BUS_SOURCES= \ dispatch.h \ driver.c \ driver.h \ - loop.c \ - loop.h \ policy.c \ policy.h \ services.c \ diff --git a/bus/activation.c b/bus/activation.c index 54ddd948..425d9c19 100644 --- a/bus/activation.c +++ b/bus/activation.c @@ -90,7 +90,7 @@ handle_timeout_callback (DBusTimeout *timeout, BusPendingActivation *pending_activation = data; while (!dbus_timeout_handle (pending_activation->timeout)) - bus_wait_for_memory (); + _dbus_wait_for_memory (); } static void @@ -103,9 +103,9 @@ bus_pending_activation_free (BusPendingActivation *pending_activation) if (pending_activation->timeout_added) { - bus_loop_remove_timeout (bus_context_get_loop (pending_activation->activation->context), - pending_activation->timeout, - handle_timeout_callback, pending_activation); + _dbus_loop_remove_timeout (bus_context_get_loop (pending_activation->activation->context), + pending_activation->timeout, + handle_timeout_callback, pending_activation); pending_activation->timeout_added = FALSE; } @@ -604,7 +604,7 @@ pending_activation_failed (BusPendingActivation *pending_activation, { /* FIXME use preallocated OOM messages instead of bus_wait_for_memory() */ while (!try_send_activation_failure (pending_activation, how)) - bus_wait_for_memory (); + _dbus_wait_for_memory (); /* Destroy this pending activation */ _dbus_hash_table_remove_string (pending_activation->activation->pending_activations, @@ -650,9 +650,9 @@ add_babysitter_watch (DBusWatch *watch, { BusPendingActivation *pending_activation = data; - return bus_loop_add_watch (bus_context_get_loop (pending_activation->activation->context), - watch, babysitter_watch_callback, pending_activation, - NULL); + return _dbus_loop_add_watch (bus_context_get_loop (pending_activation->activation->context), + watch, babysitter_watch_callback, pending_activation, + NULL); } static void @@ -661,8 +661,8 @@ remove_babysitter_watch (DBusWatch *watch, { BusPendingActivation *pending_activation = data; - bus_loop_remove_watch (bus_context_get_loop (pending_activation->activation->context), - watch, babysitter_watch_callback, pending_activation); + _dbus_loop_remove_watch (bus_context_get_loop (pending_activation->activation->context), + watch, babysitter_watch_callback, pending_activation); } static dbus_bool_t @@ -806,11 +806,11 @@ bus_activation_activate_service (BusActivation *activation, return FALSE; } - if (!bus_loop_add_timeout (bus_context_get_loop (activation->context), - pending_activation->timeout, - handle_timeout_callback, - pending_activation, - NULL)) + if (!_dbus_loop_add_timeout (bus_context_get_loop (activation->context), + pending_activation->timeout, + handle_timeout_callback, + pending_activation, + NULL)) { BUS_SET_OOM (error); bus_pending_activation_free (pending_activation); @@ -22,7 +22,6 @@ */ #include "bus.h" -#include "loop.h" #include "activation.h" #include "connection.h" #include "services.h" @@ -38,7 +37,7 @@ struct BusContext int refcount; char *type; char *address; - BusLoop *loop; + DBusLoop *loop; DBusList *servers; BusConnections *connections; BusActivation *activation; @@ -138,9 +137,9 @@ add_server_watch (DBusWatch *watch, context = server_get_context (server); - return bus_loop_add_watch (context->loop, - watch, server_watch_callback, server, - NULL); + return _dbus_loop_add_watch (context->loop, + watch, server_watch_callback, server, + NULL); } static void @@ -152,8 +151,8 @@ remove_server_watch (DBusWatch *watch, context = server_get_context (server); - bus_loop_remove_watch (context->loop, - watch, server_watch_callback, server); + _dbus_loop_remove_watch (context->loop, + watch, server_watch_callback, server); } @@ -174,8 +173,8 @@ add_server_timeout (DBusTimeout *timeout, context = server_get_context (server); - return bus_loop_add_timeout (context->loop, - timeout, server_timeout_callback, server, NULL); + return _dbus_loop_add_timeout (context->loop, + timeout, server_timeout_callback, server, NULL); } static void @@ -187,8 +186,8 @@ remove_server_timeout (DBusTimeout *timeout, context = server_get_context (server); - bus_loop_remove_timeout (context->loop, - timeout, server_timeout_callback, server); + _dbus_loop_remove_timeout (context->loop, + timeout, server_timeout_callback, server); } static void @@ -396,7 +395,7 @@ bus_context_new (const DBusString *config_file, */ context->max_completed_connections = 1024; - context->loop = bus_loop_new (); + context->loop = _dbus_loop_new (); if (context->loop == NULL) { BUS_SET_OOM (error); @@ -755,7 +754,7 @@ bus_context_unref (BusContext *context) if (context->loop) { - bus_loop_unref (context->loop); + _dbus_loop_unref (context->loop); context->loop = NULL; } @@ -798,7 +797,7 @@ bus_context_get_activation (BusContext *context) return context->activation; } -BusLoop* +DBusLoop* bus_context_get_loop (BusContext *context) { return context->loop; @@ -28,8 +28,7 @@ #include <dbus/dbus.h> #include <dbus/dbus-string.h> - -#include "loop.h" +#include <dbus/dbus-mainloop.h> typedef struct BusActivation BusActivation; typedef struct BusConnections BusConnections; @@ -51,7 +50,7 @@ const char* bus_context_get_address (BusContext *context) BusRegistry* bus_context_get_registry (BusContext *context); BusConnections* bus_context_get_connections (BusContext *context); BusActivation* bus_context_get_activation (BusContext *context); -BusLoop* bus_context_get_loop (BusContext *context); +DBusLoop* bus_context_get_loop (BusContext *context); dbus_bool_t bus_context_allow_user (BusContext *context, unsigned long uid); BusPolicy* bus_context_create_connection_policy (BusContext *context, diff --git a/bus/connection.c b/bus/connection.c index aa8d65ca..f5a0ac16 100644 --- a/bus/connection.c +++ b/bus/connection.c @@ -22,7 +22,6 @@ */ #include "connection.h" #include "dispatch.h" -#include "loop.h" #include "policy.h" #include "services.h" #include "utils.h" @@ -89,7 +88,7 @@ connection_data_slot_unref (void) } } -static BusLoop* +static DBusLoop* connection_get_loop (DBusConnection *connection) { BusConnectionData *d; @@ -134,7 +133,7 @@ bus_connection_disconnected (DBusConnection *connection) while (transaction == NULL) { transaction = bus_transaction_new (d->connections->context); - bus_wait_for_memory (); + _dbus_wait_for_memory (); } if (!bus_service_remove_owner (service, connection, @@ -144,7 +143,7 @@ bus_connection_disconnected (DBusConnection *connection) { dbus_error_free (&error); bus_transaction_cancel_and_free (transaction); - bus_wait_for_memory (); + _dbus_wait_for_memory (); goto retry; } else @@ -209,9 +208,9 @@ add_connection_watch (DBusWatch *watch, { DBusConnection *connection = data; - return bus_loop_add_watch (connection_get_loop (connection), - watch, connection_watch_callback, connection, - NULL); + return _dbus_loop_add_watch (connection_get_loop (connection), + watch, connection_watch_callback, connection, + NULL); } static void @@ -220,8 +219,8 @@ remove_connection_watch (DBusWatch *watch, { DBusConnection *connection = data; - bus_loop_remove_watch (connection_get_loop (connection), - watch, connection_watch_callback, connection); + _dbus_loop_remove_watch (connection_get_loop (connection), + watch, connection_watch_callback, connection); } static void @@ -246,8 +245,8 @@ add_connection_timeout (DBusTimeout *timeout, { DBusConnection *connection = data; - return bus_loop_add_timeout (connection_get_loop (connection), - timeout, connection_timeout_callback, connection, NULL); + return _dbus_loop_add_timeout (connection_get_loop (connection), + timeout, connection_timeout_callback, connection, NULL); } static void @@ -256,8 +255,8 @@ remove_connection_timeout (DBusTimeout *timeout, { DBusConnection *connection = data; - bus_loop_remove_timeout (connection_get_loop (connection), - timeout, connection_timeout_callback, connection); + _dbus_loop_remove_timeout (connection_get_loop (connection), + timeout, connection_timeout_callback, connection); } static dbus_bool_t diff --git a/bus/dispatch.c b/bus/dispatch.c index 2e0fa9d2..ce0d71c6 100644 --- a/bus/dispatch.c +++ b/bus/dispatch.c @@ -29,7 +29,6 @@ #include "utils.h" #include "bus.h" #include "test.h" -#include "loop.h" #include <dbus/dbus-internals.h> #include <string.h> @@ -176,7 +175,7 @@ bus_dispatch (DBusConnection *connection, * until we can. */ while (!bus_connection_preallocate_oom_error (connection)) - bus_wait_for_memory (); + _dbus_wait_for_memory (); /* Ref connection in case we disconnect it at some point in here */ dbus_connection_ref (connection); @@ -537,7 +536,7 @@ kill_client_connection (BusContext *context, _dbus_assert (s != NULL); while ((base_service = _dbus_strdup (s)) == NULL) - bus_wait_for_memory (); + _dbus_wait_for_memory (); dbus_connection_ref (connection); @@ -805,7 +804,7 @@ check_hello_message (BusContext *context, { _dbus_verbose ("no memory to get service name arg from hello\n"); dbus_error_free (&error); - bus_wait_for_memory (); + _dbus_wait_for_memory (); goto retry_get_hello_name; } else @@ -819,7 +818,7 @@ check_hello_message (BusContext *context, _dbus_verbose ("Got hello name: %s\n", name); while (!dbus_bus_set_base_service (connection, name)) - bus_wait_for_memory (); + _dbus_wait_for_memory (); scd.skip_connection = NULL; scd.failed = FALSE; @@ -849,7 +848,7 @@ check_hello_message (BusContext *context, { _dbus_verbose ("no memory to get service name arg from acquired\n"); dbus_error_free (&error); - bus_wait_for_memory (); + _dbus_wait_for_memory (); goto retry_get_acquired_name; } else diff --git a/bus/loop.c b/bus/loop.c deleted file mode 100644 index e2e129eb..00000000 --- a/bus/loop.c +++ /dev/null @@ -1,698 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu" -*- */ -/* loop.c Main loop for daemon - * - * Copyright (C) 2003 Red Hat, Inc. - * - * Licensed under the Academic Free License version 1.2 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include "loop.h" -#include "utils.h" -#include <dbus/dbus-list.h> -#include <dbus/dbus-sysdeps.h> - -struct BusLoop -{ - int refcount; - DBusList *callbacks; - int callback_list_serial; - int watch_count; - int timeout_count; - int depth; /**< number of recursive runs */ -}; - -typedef enum -{ - CALLBACK_WATCH, - CALLBACK_TIMEOUT -} CallbackType; - -typedef struct -{ - CallbackType type; - void *data; - DBusFreeFunction free_data_func; -} Callback; - -typedef struct -{ - Callback callback; - BusWatchFunction function; - DBusWatch *watch; - /* last watch handle failed due to OOM */ - unsigned int last_iteration_oom : 1; -} WatchCallback; - -typedef struct -{ - Callback callback; - DBusTimeout *timeout; - BusTimeoutFunction function; - unsigned long last_tv_sec; - unsigned long last_tv_usec; -} TimeoutCallback; - -#define WATCH_CALLBACK(callback) ((WatchCallback*)callback) -#define TIMEOUT_CALLBACK(callback) ((TimeoutCallback*)callback) - -static WatchCallback* -watch_callback_new (DBusWatch *watch, - BusWatchFunction function, - void *data, - DBusFreeFunction free_data_func) -{ - WatchCallback *cb; - - cb = dbus_new (WatchCallback, 1); - if (cb == NULL) - return NULL; - - cb->watch = watch; - cb->function = function; - cb->last_iteration_oom = FALSE; - cb->callback.type = CALLBACK_WATCH; - cb->callback.data = data; - cb->callback.free_data_func = free_data_func; - - return cb; -} - -static TimeoutCallback* -timeout_callback_new (DBusTimeout *timeout, - BusTimeoutFunction function, - void *data, - DBusFreeFunction free_data_func) -{ - TimeoutCallback *cb; - - cb = dbus_new (TimeoutCallback, 1); - if (cb == NULL) - return NULL; - - cb->timeout = timeout; - cb->function = function; - _dbus_get_current_time (&cb->last_tv_sec, - &cb->last_tv_usec); - cb->callback.type = CALLBACK_TIMEOUT; - cb->callback.data = data; - cb->callback.free_data_func = free_data_func; - - return cb; -} - -static void -callback_free (Callback *cb) -{ - if (cb->free_data_func) - (* cb->free_data_func) (cb->data); - - dbus_free (cb); -} - -static dbus_bool_t -add_callback (BusLoop *loop, - Callback *cb) -{ - if (!_dbus_list_append (&loop->callbacks, cb)) - return FALSE; - - loop->callback_list_serial += 1; - - switch (cb->type) - { - case CALLBACK_WATCH: - loop->watch_count += 1; - break; - case CALLBACK_TIMEOUT: - loop->timeout_count += 1; - break; - } - - return TRUE; -} - -static void -remove_callback (BusLoop *loop, - DBusList *link) -{ - Callback *cb = link->data; - - switch (cb->type) - { - case CALLBACK_WATCH: - loop->watch_count -= 1; - break; - case CALLBACK_TIMEOUT: - loop->timeout_count -= 1; - break; - } - - callback_free (cb); - _dbus_list_remove_link (&loop->callbacks, link); - loop->callback_list_serial += 1; -} - -BusLoop* -bus_loop_new (void) -{ - BusLoop *loop; - - loop = dbus_new0 (BusLoop, 1); - if (loop == NULL) - return NULL; - - loop->refcount = 1; - - return loop; -} - -void -bus_loop_ref (BusLoop *loop) -{ - _dbus_assert (loop != NULL); - _dbus_assert (loop->refcount > 0); - - loop->refcount += 1; -} - -void -bus_loop_unref (BusLoop *loop) -{ - _dbus_assert (loop != NULL); - _dbus_assert (loop->refcount > 0); - - loop->refcount -= 1; - if (loop->refcount == 0) - { - - dbus_free (loop); - } -} - -dbus_bool_t -bus_loop_add_watch (BusLoop *loop, - DBusWatch *watch, - BusWatchFunction function, - void *data, - DBusFreeFunction free_data_func) -{ - WatchCallback *wcb; - - wcb = watch_callback_new (watch, function, data, free_data_func); - if (wcb == NULL) - return FALSE; - - if (!add_callback (loop, (Callback*) wcb)) - { - wcb->callback.free_data_func = NULL; /* don't want to have this side effect */ - callback_free ((Callback*) wcb); - return FALSE; - } - - return TRUE; -} - -void -bus_loop_remove_watch (BusLoop *loop, - DBusWatch *watch, - BusWatchFunction function, - void *data) -{ - DBusList *link; - - link = _dbus_list_get_first_link (&loop->callbacks); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&loop->callbacks, link); - Callback *this = link->data; - - if (this->type == CALLBACK_WATCH && - WATCH_CALLBACK (this)->watch == watch && - this->data == data && - WATCH_CALLBACK (this)->function == function) - { - remove_callback (loop, link); - - return; - } - - link = next; - } - - _dbus_warn ("could not find watch %p function %p data %p to remove\n", - watch, function, data); -} - -dbus_bool_t -bus_loop_add_timeout (BusLoop *loop, - DBusTimeout *timeout, - BusTimeoutFunction function, - void *data, - DBusFreeFunction free_data_func) -{ - TimeoutCallback *tcb; - - tcb = timeout_callback_new (timeout, function, data, free_data_func); - if (tcb == NULL) - return FALSE; - - if (!add_callback (loop, (Callback*) tcb)) - { - tcb->callback.free_data_func = NULL; /* don't want to have this side effect */ - callback_free ((Callback*) tcb); - return FALSE; - } - - return TRUE; -} - -void -bus_loop_remove_timeout (BusLoop *loop, - DBusTimeout *timeout, - BusTimeoutFunction function, - void *data) -{ - DBusList *link; - - link = _dbus_list_get_first_link (&loop->callbacks); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&loop->callbacks, link); - Callback *this = link->data; - - if (this->type == CALLBACK_TIMEOUT && - TIMEOUT_CALLBACK (this)->timeout == timeout && - this->data == data && - TIMEOUT_CALLBACK (this)->function == function) - { - remove_callback (loop, link); - - return; - } - - link = next; - } - - _dbus_warn ("could not find timeout %p function %p data %p to remove\n", - timeout, function, data); -} - -/* Convolutions from GLib, there really must be a better way - * to do this. - */ -static dbus_bool_t -check_timeout (unsigned long tv_sec, - unsigned long tv_usec, - TimeoutCallback *tcb, - int *timeout) -{ - long sec; - long msec; - unsigned long expiration_tv_sec; - unsigned long expiration_tv_usec; - long interval_seconds; - long interval_milliseconds; - int interval; - - interval = dbus_timeout_get_interval (tcb->timeout); - - interval_seconds = interval / 1000; - interval_milliseconds = interval - interval_seconds * 1000; - - expiration_tv_sec = tcb->last_tv_sec + interval_seconds; - expiration_tv_usec = tcb->last_tv_usec + interval_milliseconds * 1000; - if (expiration_tv_usec >= 1000000) - { - expiration_tv_usec -= 1000000; - expiration_tv_sec += 1; - } - - sec = expiration_tv_sec - tv_sec; - msec = (expiration_tv_usec - tv_usec) / 1000; - -#if 0 - printf ("Interval is %ld seconds %ld msecs\n", - interval_seconds, - interval_milliseconds); - printf ("Now is %lu seconds %lu usecs\n", - tv_sec, tv_usec); - printf ("Exp is %lu seconds %lu usecs\n", - expiration_tv_sec, expiration_tv_usec); - printf ("Pre-correction, remaining sec %ld msec %ld\n", sec, msec); -#endif - - /* We do the following in a rather convoluted fashion to deal with - * the fact that we don't have an integral type big enough to hold - * the difference of two timevals in millseconds. - */ - if (sec < 0 || (sec == 0 && msec < 0)) - msec = 0; - else - { - if (msec < 0) - { - msec += 1000; - sec -= 1; - } - - if (sec > interval_seconds || - (sec == interval_seconds && msec > interval_milliseconds)) - { - /* The system time has been set backwards, reset the timeout */ - tcb->last_tv_sec = tv_sec; - tcb->last_tv_usec = tv_usec; - - msec = MIN (_DBUS_INT_MAX, interval); - - _dbus_verbose ("System clock went backward\n"); - } - else - { - msec = MIN (_DBUS_INT_MAX, (unsigned int)msec + 1000 * (unsigned int)sec); - } - } - - *timeout = msec; - -#if 0 - printf ("Timeout expires in %d milliseconds\n", *timeout); -#endif - - return msec == 0; -} - -/* 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 -bus_loop_iterate (BusLoop *loop, - dbus_bool_t block) -{ - dbus_bool_t retval; - DBusPollFD *fds; - int n_fds; - WatchCallback **watches_for_fds; - int i; - DBusList *link; - int n_ready; - int initial_serial; - long timeout; - dbus_bool_t oom_watch_pending; - int orig_depth; - - retval = FALSE; - - fds = NULL; - watches_for_fds = NULL; - oom_watch_pending = FALSE; - orig_depth = loop->depth; - -#if 0 - _dbus_verbose (" iterate %d timeouts %d watches\n", - loop->timeout_count, loop->watch_count); -#endif - - if (loop->callbacks == NULL) - { - bus_loop_quit (loop); - goto next_iteration; - } - - /* count enabled watches */ - n_fds = 0; - link = _dbus_list_get_first_link (&loop->callbacks); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&loop->callbacks, link); - Callback *cb = link->data; - if (cb->type == CALLBACK_WATCH) - { - WatchCallback *wcb = WATCH_CALLBACK (cb); - - if (!wcb->last_iteration_oom && - dbus_watch_get_enabled (wcb->watch)) - ++n_fds; - } - - link = next; - } - - /* fill our array of fds and watches */ - if (n_fds > 0) - { - fds = dbus_new0 (DBusPollFD, n_fds); - while (fds == NULL) - { - bus_wait_for_memory (); - fds = dbus_new0 (DBusPollFD, n_fds); - } - - watches_for_fds = dbus_new (WatchCallback*, n_fds); - while (watches_for_fds == NULL) - { - bus_wait_for_memory (); - watches_for_fds = dbus_new (WatchCallback*, n_fds); - } - - i = 0; - link = _dbus_list_get_first_link (&loop->callbacks); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&loop->callbacks, link); - Callback *cb = link->data; - if (cb->type == CALLBACK_WATCH) - { - unsigned int flags; - WatchCallback *wcb = WATCH_CALLBACK (cb); - - if (wcb->last_iteration_oom) - { - /* we skip this one this time, but reenable it next time, - * and have a timeout on this iteration - */ - wcb->last_iteration_oom = FALSE; - oom_watch_pending = TRUE; - } - else if (dbus_watch_get_enabled (wcb->watch)) - { - watches_for_fds[i] = wcb; - - flags = dbus_watch_get_flags (wcb->watch); - - fds[i].fd = dbus_watch_get_fd (wcb->watch); - if (flags & DBUS_WATCH_READABLE) - fds[i].events |= _DBUS_POLLIN; - if (flags & DBUS_WATCH_WRITABLE) - fds[i].events |= _DBUS_POLLOUT; - - ++i; - } - } - - link = next; - } - - _dbus_assert (i == n_fds); - } - - timeout = -1; - if (loop->timeout_count > 0) - { - unsigned long tv_sec; - unsigned long tv_usec; - - retval = TRUE; - - _dbus_get_current_time (&tv_sec, &tv_usec); - - link = _dbus_list_get_first_link (&loop->callbacks); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&loop->callbacks, link); - Callback *cb = link->data; - - if (cb->type == CALLBACK_TIMEOUT && - dbus_timeout_get_enabled (TIMEOUT_CALLBACK (cb)->timeout)) - { - TimeoutCallback *tcb = TIMEOUT_CALLBACK (cb); - int msecs_remaining; - - check_timeout (tv_sec, tv_usec, tcb, &msecs_remaining); - - if (timeout < 0) - timeout = msecs_remaining; - else - timeout = MIN (msecs_remaining, timeout); - - _dbus_assert (timeout >= 0); - - if (timeout == 0) - break; /* it's not going to get shorter... */ - } - - link = next; - } - } - - if (!block) - { - timeout = 0; -#if 0 - printf ("timeout is 0 as we aren't blocking\n"); -#endif - } - - /* if a watch is OOM, don't wait longer than the OOM - * wait to re-enable it - */ - if (oom_watch_pending) - timeout = MIN (timeout, bus_get_oom_wait ()); - - n_ready = _dbus_poll (fds, n_fds, timeout); - - initial_serial = loop->callback_list_serial; - - if (loop->timeout_count > 0) - { - unsigned long tv_sec; - unsigned long tv_usec; - - _dbus_get_current_time (&tv_sec, &tv_usec); - - /* It'd be nice to avoid this O(n) thingy here */ - link = _dbus_list_get_first_link (&loop->callbacks); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&loop->callbacks, link); - Callback *cb = link->data; - - if (initial_serial != loop->callback_list_serial) - goto next_iteration; - - if (loop->depth != orig_depth) - goto next_iteration; - - if (cb->type == CALLBACK_TIMEOUT && - dbus_timeout_get_enabled (TIMEOUT_CALLBACK (cb)->timeout)) - { - TimeoutCallback *tcb = TIMEOUT_CALLBACK (cb); - int msecs_remaining; - - if (check_timeout (tv_sec, tv_usec, - tcb, &msecs_remaining)) - { - /* Save last callback time and fire this timeout */ - tcb->last_tv_sec = tv_sec; - tcb->last_tv_usec = tv_usec; - -#if 0 - printf (" invoking timeout\n"); -#endif - - (* tcb->function) (tcb->timeout, - cb->data); - } - } - - link = next; - } - } - - if (n_ready > 0) - { - i = 0; - while (i < n_fds) - { - /* FIXME I think this "restart if we change the watches" - * approach could result in starving watches - * toward the end of the list. - */ - if (initial_serial != loop->callback_list_serial) - goto next_iteration; - - if (loop->depth != orig_depth) - goto next_iteration; - - if (fds[i].revents != 0) - { - WatchCallback *wcb; - unsigned int condition; - - wcb = watches_for_fds[i]; - - condition = 0; - if (fds[i].revents & _DBUS_POLLIN) - condition |= DBUS_WATCH_READABLE; - if (fds[i].revents & _DBUS_POLLOUT) - condition |= DBUS_WATCH_WRITABLE; - if (fds[i].revents & _DBUS_POLLHUP) - condition |= DBUS_WATCH_HANGUP; - if (fds[i].revents & _DBUS_POLLERR) - condition |= DBUS_WATCH_ERROR; - - /* condition may still be 0 if we got some - * weird POLLFOO thing like POLLWRBAND - */ - - if (condition != 0 && - dbus_watch_get_enabled (wcb->watch)) - { - if (!(* wcb->function) (wcb->watch, - condition, - ((Callback*)wcb)->data)) - wcb->last_iteration_oom = TRUE; - - retval = TRUE; - } - } - - ++i; - } - } - - next_iteration: - dbus_free (fds); - dbus_free (watches_for_fds); - - return retval; -} - -void -bus_loop_run (BusLoop *loop) -{ - int our_exit_depth; - - bus_loop_ref (loop); - - our_exit_depth = loop->depth; - loop->depth += 1; - - while (loop->depth != our_exit_depth) - bus_loop_iterate (loop, TRUE); - - bus_loop_unref (loop); -} - -void -bus_loop_quit (BusLoop *loop) -{ - _dbus_assert (loop->depth > 0); - - loop->depth -= 1; -} diff --git a/bus/loop.h b/bus/loop.h deleted file mode 100644 index 19b3bcd4..00000000 --- a/bus/loop.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu" -*- */ -/* loop.h Main loop for daemon - * - * Copyright (C) 2003 Red Hat, Inc. - * - * Licensed under the Academic Free License version 1.2 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef BUS_LOOP_H -#define BUS_LOOP_H - -#include <dbus/dbus.h> - -typedef struct BusLoop BusLoop; - -typedef dbus_bool_t (* BusWatchFunction) (DBusWatch *watch, - unsigned int condition, - void *data); -typedef void (* BusTimeoutFunction) (DBusTimeout *timeout, - void *data); - - -BusLoop* bus_loop_new (void); -void bus_loop_ref (BusLoop *loop); -void bus_loop_unref (BusLoop *loop); -dbus_bool_t bus_loop_add_watch (BusLoop *loop, - DBusWatch *watch, - BusWatchFunction function, - void *data, - DBusFreeFunction free_data_func); -void bus_loop_remove_watch (BusLoop *loop, - DBusWatch *watch, - BusWatchFunction function, - void *data); -dbus_bool_t bus_loop_add_timeout (BusLoop *loop, - DBusTimeout *timeout, - BusTimeoutFunction function, - void *data, - DBusFreeFunction free_data_func); -void bus_loop_remove_timeout (BusLoop *loop, - DBusTimeout *timeout, - BusTimeoutFunction function, - void *data); -void bus_loop_run (BusLoop *loop); -void bus_loop_quit (BusLoop *loop); -dbus_bool_t bus_loop_iterate (BusLoop *loop, - dbus_bool_t block); - - -#endif /* BUS_LOOP_H */ @@ -21,7 +21,6 @@ * */ #include "bus.h" -#include "loop.h" #include <dbus/dbus-internals.h> #include <stdio.h> #include <stdlib.h> @@ -40,7 +39,7 @@ signal_handler (int sig) case SIGHUP: got_sighup = TRUE; case SIGTERM: - bus_loop_quit (bus_context_get_loop (context)); + _dbus_loop_quit (bus_context_get_loop (context)); break; } } @@ -230,7 +229,7 @@ main (int argc, char **argv) _dbus_set_signal_handler (SIGTERM, signal_handler); _dbus_verbose ("We are on D-Bus...\n"); - bus_loop_run (bus_context_get_loop (context)); + _dbus_loop_run (bus_context_get_loop (context)); bus_context_shutdown (context); bus_context_unref (context); @@ -25,7 +25,6 @@ #ifdef DBUS_BUILD_TESTS #include "test.h" -#include "loop.h" #include <dbus/dbus-internals.h> #include <dbus/dbus-list.h> @@ -34,7 +33,7 @@ * are different from the real handlers in connection.c */ static DBusList *clients = NULL; -static BusLoop *client_loop = NULL; +static DBusLoop *client_loop = NULL; static dbus_bool_t client_watch_callback (DBusWatch *watch, @@ -59,9 +58,9 @@ add_client_watch (DBusWatch *watch, { DBusConnection *connection = data; - return bus_loop_add_watch (client_loop, - watch, client_watch_callback, connection, - NULL); + return _dbus_loop_add_watch (client_loop, + watch, client_watch_callback, connection, + NULL); } static void @@ -70,8 +69,8 @@ remove_client_watch (DBusWatch *watch, { DBusConnection *connection = data; - bus_loop_remove_watch (client_loop, - watch, client_watch_callback, connection); + _dbus_loop_remove_watch (client_loop, + watch, client_watch_callback, connection); } static void @@ -94,7 +93,7 @@ add_client_timeout (DBusTimeout *timeout, { DBusConnection *connection = data; - return bus_loop_add_timeout (client_loop, timeout, client_timeout_callback, connection, NULL); + return _dbus_loop_add_timeout (client_loop, timeout, client_timeout_callback, connection, NULL); } static void @@ -103,7 +102,7 @@ remove_client_timeout (DBusTimeout *timeout, { DBusConnection *connection = data; - bus_loop_remove_timeout (client_loop, timeout, client_timeout_callback, connection); + _dbus_loop_remove_timeout (client_loop, timeout, client_timeout_callback, connection); } static DBusHandlerResult @@ -121,7 +120,7 @@ client_disconnect_handler (DBusMessageHandler *handler, if (clients == NULL) { - bus_loop_unref (client_loop); + _dbus_loop_unref (client_loop); client_loop = NULL; } @@ -199,7 +198,7 @@ bus_setup_debug_client (DBusConnection *connection) if (client_loop == NULL) { - client_loop = bus_loop_new (); + client_loop = _dbus_loop_new (); if (client_loop == NULL) goto out; } @@ -250,7 +249,7 @@ bus_setup_debug_client (DBusConnection *connection) if (clients == NULL) { - bus_loop_unref (client_loop); + _dbus_loop_unref (client_loop); client_loop = NULL; } } @@ -304,10 +303,10 @@ bus_test_run_clients_loop (void) return; /* Do one blocking wait, since we're expecting data */ - bus_loop_iterate (client_loop, TRUE); + _dbus_loop_iterate (client_loop, TRUE); /* Then mop everything up */ - while (bus_loop_iterate (client_loop, FALSE)) + while (_dbus_loop_iterate (client_loop, FALSE)) ; } @@ -315,10 +314,10 @@ void bus_test_run_bus_loop (BusContext *context) { /* Do one blocking wait, since we're expecting data */ - bus_loop_iterate (bus_context_get_loop (context), TRUE); + _dbus_loop_iterate (bus_context_get_loop (context), TRUE); /* Then mop everything up */ - while (bus_loop_iterate (bus_context_get_loop (context), FALSE)) + while (_dbus_loop_iterate (bus_context_get_loop (context), FALSE)) ; } @@ -330,8 +329,8 @@ bus_test_run_everything (BusContext *context) i = 0; while (i < 2) { - while (bus_loop_iterate (bus_context_get_loop (context), FALSE) || - (client_loop == NULL || bus_loop_iterate (client_loop, FALSE))) + while (_dbus_loop_iterate (bus_context_get_loop (context), FALSE) || + (client_loop == NULL || _dbus_loop_iterate (client_loop, FALSE))) ; ++i; } diff --git a/bus/utils.c b/bus/utils.c index df061165..65873b59 100644 --- a/bus/utils.c +++ b/bus/utils.c @@ -25,26 +25,10 @@ #include <config.h> #include "utils.h" #include <dbus/dbus-sysdeps.h> +#include <dbus/dbus-mainloop.h> const char bus_no_memory_message[] = "Memory allocation failure in message bus"; -int -bus_get_oom_wait (void) -{ -#ifdef DBUS_BUILD_TESTS - /* make tests go fast */ - return 0; -#else - return 500; -#endif -} - -void -bus_wait_for_memory (void) -{ - _dbus_sleep_milliseconds (bus_get_oom_wait ()); -} - void bus_connection_dispatch_all_messages (DBusConnection *connection) { @@ -58,7 +42,7 @@ bus_connection_dispatch_one_message (DBusConnection *connection) DBusDispatchStatus status; while ((status = dbus_connection_dispatch (connection)) == DBUS_DISPATCH_NEED_MEMORY) - bus_wait_for_memory (); + _dbus_wait_for_memory (); return status == DBUS_DISPATCH_DATA_REMAINS; } diff --git a/bus/utils.h b/bus/utils.h index 5b30de60..15f05088 100644 --- a/bus/utils.h +++ b/bus/utils.h @@ -27,9 +27,6 @@ #include <dbus/dbus.h> -int bus_get_oom_wait (void); -void bus_wait_for_memory (void); - extern const char bus_no_memory_message[]; #define BUS_SET_OOM(error) dbus_set_error ((error), DBUS_ERROR_NO_MEMORY, bus_no_memory_message) diff --git a/dbus/Makefile.am b/dbus/Makefile.am index 7d5ed501..957227e8 100644 --- a/dbus/Makefile.am +++ b/dbus/Makefile.am @@ -22,7 +22,9 @@ dbusinclude_HEADERS= \ dbus-threads.h \ dbus-types.h -DBUS_SOURCES= \ +### source code that goes in the installed client library +### and is specific to library functionality +DBUS_LIB_SOURCES= \ dbus-address.c \ dbus-auth.c \ dbus-auth.h \ @@ -68,7 +70,11 @@ DBUS_SOURCES= \ ## dbus-md5.c \ ## dbus-md5.h \ -UTIL_SOURCES= \ +### source code that goes in the installed client library +### AND is generic utility functionality used by the +### daemon or test programs (all symbols in here should +### be underscore-prefixed) +DBUS_SHARED_SOURCES= \ dbus-dataslot.c \ dbus-dataslot.h \ dbus-hash.c \ @@ -92,13 +98,23 @@ UTIL_SOURCES= \ dbus-sysdeps.c \ dbus-sysdeps.h +### source code that is generic utility functionality used +### by the bus daemon or test apps, but is NOT included +### in the D-BUS client library (all symbols in here +### should be underscore-prefixed but don't really need +### to be unless they move to DBUS_SHARED_SOURCES later) +DBUS_UTIL_SOURCES= \ + dbus-mainloop.c \ + dbus-mainloop.h + libdbus_1_la_SOURCES= \ - $(DBUS_SOURCES) \ - $(UTIL_SOURCES) + $(DBUS_LIB_SOURCES) \ + $(DBUS_SHARED_SOURCES) libdbus_convenience_la_SOURCES= \ - $(DBUS_SOURCES) \ - $(UTIL_SOURCES) + $(DBUS_LIB_SOURCES) \ + $(DBUS_SHARED_SOURCES) \ + $(DBUS_UTIL_SOURCES) ## this library is the same as libdbus, but exports all the symbols ## and is only used for static linking within the dbus package. |