diff options
author | Havoc Pennington <hp@redhat.com> | 2003-10-26 15:36:15 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2003-10-26 15:36:15 +0000 |
commit | a63411cb3d101cef3e3fa5061001733b26d58fe1 (patch) | |
tree | ce52cf6d40888f40ec337d4f26d8943d03eebb30 | |
parent | eb9aa9da9564f2df788580394e67ae6105e517fb (diff) |
2003-10-26 Havoc Pennington <hp@redhat.com>
* dbus/dbus-connection.c: fix docs to properly describe the
disconnected message
(_dbus_connection_notify_disconnected): remove this function;
we can't synchronously add the disconnected message, we have to
do it after we've queued any remaining real messages
(_dbus_connection_get_dispatch_status_unlocked): queue the
disconnect message only if the transport has finished queueing all
its real messages and is disconnected.
(dbus_connection_disconnect): update the dispatch status here
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | dbus/dbus-connection-internal.h | 1 | ||||
-rw-r--r-- | dbus/dbus-connection.c | 54 | ||||
-rw-r--r-- | dbus/dbus-transport.c | 3 |
4 files changed, 41 insertions, 29 deletions
@@ -1,3 +1,15 @@ +2003-10-26 Havoc Pennington <hp@redhat.com> + + * dbus/dbus-connection.c: fix docs to properly describe the + disconnected message + (_dbus_connection_notify_disconnected): remove this function; + we can't synchronously add the disconnected message, we have to + do it after we've queued any remaining real messages + (_dbus_connection_get_dispatch_status_unlocked): queue the + disconnect message only if the transport has finished queueing all + its real messages and is disconnected. + (dbus_connection_disconnect): update the dispatch status here + 2003-10-22 Havoc Pennington <hp@redhat.com> * bus/bus.c (bus_context_check_security_policy): fix up assertion diff --git a/dbus/dbus-connection-internal.h b/dbus/dbus-connection-internal.h index b19ab636..e53908b5 100644 --- a/dbus/dbus-connection-internal.h +++ b/dbus/dbus-connection-internal.h @@ -77,7 +77,6 @@ DBusConnection* _dbus_connection_new_for_transport (DBusTransport void _dbus_connection_do_iteration (DBusConnection *connection, unsigned int flags, int timeout_milliseconds); -void _dbus_connection_notify_disconnected (DBusConnection *connection); DBusPendingCall* _dbus_pending_call_new (DBusConnection *connection, int timeout_milliseconds, diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 61de8b1f..7871f922 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -99,15 +99,17 @@ * handle the details here for you by setting up watch functions. * * When a connection is disconnected, you are guaranteed to get a - * message with the name #DBUS_MESSAGE_LOCAL_DISCONNECT. + * signal "Disconnected" from the interface + * #DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL, path + * #DBUS_PATH_ORG_FREEDESKTOP_LOCAL. * * You may not drop the last reference to a #DBusConnection * until that connection has been disconnected. * * You may dispatch the unprocessed incoming message queue even if the - * connection is disconnected. However, #DBUS_MESSAGE_LOCAL_DISCONNECT - * will always be the last message in the queue (obviously no messages - * are received after disconnection). + * connection is disconnected. However, "Disconnected" will always be + * the last message in the queue (obviously no messages are received + * after disconnection). * * #DBusConnection has thread locks and drops them when invoking user * callbacks, so in general is transparently threadsafe. However, @@ -577,25 +579,6 @@ _dbus_connection_toggle_timeout (DBusConnection *connection, timeout, enabled); } -/** - * Tells the connection that the transport has been disconnected. - * Results in posting a disconnect message on the incoming message - * queue. Only has an effect the first time it's called. - * - * @param connection the connection - */ -void -_dbus_connection_notify_disconnected (DBusConnection *connection) -{ - if (connection->disconnect_message_link) - { - /* We haven't sent the disconnect message already */ - _dbus_connection_queue_synthesized_message_link (connection, - connection->disconnect_message_link); - connection->disconnect_message_link = NULL; - } -} - static dbus_bool_t _dbus_connection_attach_pending_call_unlocked (DBusConnection *connection, DBusPendingCall *pending) @@ -1305,18 +1288,27 @@ dbus_connection_unref (DBusConnection *connection) * function does not affect the connection's reference count. It's * safe to disconnect a connection more than once; all calls after the * first do nothing. It's impossible to "reconnect" a connection, a - * new connection must be created. + * new connection must be created. This function may result in a call + * to the DBusDispatchStatusFunction set with + * dbus_connection_set_dispatch_status_function(), as the disconnect + * message it generates needs to be dispatched. * * @param connection the connection. */ void dbus_connection_disconnect (DBusConnection *connection) { + DBusDispatchStatus status; + _dbus_return_if_fail (connection != NULL); CONNECTION_LOCK (connection); _dbus_transport_disconnect (connection->transport); - CONNECTION_UNLOCK (connection); + + status = _dbus_connection_get_dispatch_status_unlocked (connection); + + /* this calls out to user code */ + _dbus_connection_update_dispatch_status_and_unlock (connection, status); } static dbus_bool_t @@ -2351,6 +2343,18 @@ _dbus_connection_get_dispatch_status_unlocked (DBusConnection *connection) status = _dbus_transport_get_dispatch_status (connection->transport); + if (status == DBUS_DISPATCH_COMPLETE && + connection->disconnect_message_link && + !_dbus_transport_get_is_connected (connection->transport)) + { + /* We haven't sent the disconnect message already, + * and all real messages have been queued up. + */ + _dbus_connection_queue_synthesized_message_link (connection, + connection->disconnect_message_link); + connection->disconnect_message_link = NULL; + } + if (status != DBUS_DISPATCH_COMPLETE) return status; else if (connection->n_incoming > 0) diff --git a/dbus/dbus-transport.c b/dbus/dbus-transport.c index 4625cf25..b58073f6 100644 --- a/dbus/dbus-transport.c +++ b/dbus/dbus-transport.c @@ -415,9 +415,6 @@ _dbus_transport_disconnect (DBusTransport *transport) (* transport->vtable->disconnect) (transport); transport->disconnected = TRUE; - - if (transport->connection) - _dbus_connection_notify_disconnected (transport->connection); } /** |