Suggestion: dbus_connection_set_suspended to temporarily
suspend DBUS-Input
Seth Nickell
seth at gnome.org
Mon Sep 27 17:59:45 UTC 2004
Won't this cause, e.g., other dbus services calling you to time out
waiting for a reply?
On Mon, 27 Sep 2004 8:23am, Friedemann KleintFa. metis wrote:
> Hi,
>
> I would like to suggest the following patch:
>
> - API extension:
>
> dbus_connection_set_suspended(DBusConnection *connection,
> dbus_bool_t suspended)
>
> Suspends dispatching of DBUS-Messages.
>
> - Aim:
>
> There are situations (mainly in GUI-applications) in which
> one does not want IPC-messages to interfer with normal event
> processing for a limited amount of time.
>
> For example, the application may perform some lenghty
> operation in a background thread and does mainloop-iterations
> while waiting for the thread to terminate. In this case,
> only expose-events should be processed.
>
> There should be a function to suspend DBUS-input. On resuming,
> all pending messages should be delivered.
>
> So far, the Qt/Glib bindings offer no such function; one
> would have to re-do the mainloop integration.
>
> - Solution:
>
> Havoc suggested setting the receive size to a low value, but
> this causes messages to be lost.
>
> I added a "suspended" flag the connection-structure which
> causes _dbus_connection_get_dispatch_status_unlocked() to
> return DISPATCH_COMPLETE if set. There might a more elegant
> way to do this?
>
> -Friedemann Kleint
>
>
> --------------- Patch (applicable to dbus-0.22)-------------
> --- dbus-0.22/dbus/dbus-connection.c.orig 2004-09-27 11:16:41.010029000
> +0200
> +++ dbus-0.22/dbus/dbus-connection.c 2004-09-27 13:29:45.340001000
> +0200
> @@ -203,6 +203,7 @@
> DBusDispatchStatusFunction dispatch_status_function; /**< Function
> on dispatch status changes */
> void *dispatch_status_data; /**< Application data for
> dispatch_status_function */
> DBusFreeFunction free_dispatch_status_data; /**< free
> dispatch_status_data */
> + dbus_bool_t suspended; /**< Message dispatching suspended */
>
> DBusDispatchStatus last_dispatch_status; /**< The last dispatch
> status we reported to the application. */
>
> @@ -905,6 +906,7 @@
> connection->pending_replies = pending_replies;
> connection->outgoing_counter = outgoing_counter;
> connection->filter_list = NULL;
> + connection->suspended = FALSE;
> connection->last_dispatch_status = DBUS_DISPATCH_COMPLETE; /* so
> we're notified first time there's data */
> connection->objects = objects;
> connection->exit_on_disconnect = FALSE;
> @@ -2340,6 +2342,8 @@
> static DBusDispatchStatus
> _dbus_connection_get_dispatch_status_unlocked (DBusConnection
> *connection)
> {
> + if (connection->suspended)
> + return DBUS_DISPATCH_COMPLETE;
> if (connection->n_incoming > 0)
> return DBUS_DISPATCH_DATA_REMAINS;
> else if (!_dbus_transport_queue_messages (connection->transport))
> @@ -2408,6 +2412,27 @@
> }
>
> /**
> + * Suspend dispatching of messages.
> + *
> + * @param connection the connection.
> + * @param suspended flag indicating state.
> + */
> +
> +void
> +dbus_connection_set_suspended(DBusConnection *connection,
> + dbus_bool_t suspended)
> +{
> + _dbus_return_if_fail (connection != NULL);
> +
> + CONNECTION_LOCK (connection);
> +
> + connection->suspended = suspended;
> +
> + CONNECTION_UNLOCK (connection);
> +}
> +
> +
> +/**
> * Gets the current state (what we would currently return
> * from dbus_connection_dispatch()) but doesn't actually
> * dispatch any messages.
> --- dbus-0.22/dbus/dbus-connection.h.orig 2004-09-27 11:16:50.980001000
> +0200
> +++ dbus-0.22/dbus/dbus-connection.h 2004-09-27 13:25:03.390000000
> +0200
> @@ -104,6 +104,8 @@
>
> DBusMessage *message);
> DBusMessage* dbus_connection_pop_message
> (DBusConnection *connection);
> DBusDispatchStatus dbus_connection_get_dispatch_status
> (DBusConnection *connection);
> +void dbus_connection_set_suspended
> (DBusConnection *connection,
> +
> dbus_bool_t suspended);
> DBusDispatchStatus dbus_connection_dispatch
> (DBusConnection *connection);
> dbus_bool_t dbus_connection_send
> (DBusConnection *connection,
> --
> dbus mailing list
> dbus at freedesktop.org
> http://freedesktop.org/mailman/listinfo/dbus
-Seth
More information about the dbus
mailing list