mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-05-06 03:28:11 +02:00
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:
parent
eb9aa9da95
commit
a63411cb3d
4 changed files with 41 additions and 29 deletions
12
ChangeLog
12
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue