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