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
This commit is contained in:
Havoc Pennington 2003-10-26 15:36:15 +00:00
parent eb9aa9da95
commit a63411cb3d
4 changed files with 41 additions and 29 deletions

View file

@ -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

View file

@ -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,

View file

@ -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)

View file

@ -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);
}
/**