diff -ur dbus-0.23/ChangeLog dbus-0.23.1/ChangeLog --- dbus-0.23/ChangeLog 2005-01-13 00:48:43.000000000 +0200 +++ dbus-0.23.1/ChangeLog 2005-02-11 20:25:48.000000000 +0200 @@ -1,3 +1,33 @@ +2005-02-11 Joe Shaw + + * NEWS: Update for 0.23.1 + + * configure.in: Release 0.23.1 + +2005-02-10 Joe Shaw + + * dbus/dbus-connection.c + (_dbus_connection_queue_received_message_link, + _dbus_connection_message_sent): Add the path to + the verbose output. + (_dbus_connection_send_preallocated_and_unlock): Added. Calls + _dbus_connection_send_preallocated_unlocked(), updated the + dispatch status, and unlocks. Fixes a bug where certain + situations (like a broken pipe) could cause a Disconnect message + to not be sent, tricking the bus into thinking a service was still + there when the process had quit. + (_dbus_connection_send_preallocated): Call + _dbus_connection_send_preallocated_and_unlock(). + (_dbus_connection_send_and_unlock): Added. Calls + _dbus_connection_send_preallocated_and_unlock(). + (dbus_connection_send): Call _dbus_connection_send_and_unlock(). + (dbus_connection_send_with_reply): Update the dispatch status and + unlock. + + * mono/Service.cs (~Service): Added. Removes the filter so that + we don't get unmanaged code calling back into a GCed delegate. + (RemoveFilter); Added. + 2005-01-12 Joe Shaw * NEWS: Update for 0.23. diff -ur dbus-0.23/NEWS dbus-0.23.1/NEWS --- dbus-0.23/NEWS 2005-01-13 00:20:40.000000000 +0200 +++ dbus-0.23.1/NEWS 2005-02-11 20:25:16.000000000 +0200 @@ -1,3 +1,11 @@ +D-BUS 0.23.1 (11 Feb 2005) +=== +- fix a bug in which the bus daemon wouldn't recognize that a service + owner quit +- fix a bug in the mono bindings that would cause unmanaged code to + call back into a delegate that had been garbage collected and + crashed. + D-BUS 0.23 (11 Jan 2005) === diff -ur dbus-0.23/configure dbus-0.23.1/configure --- dbus-0.23/configure 2005-01-13 00:21:25.000000000 +0200 +++ dbus-0.23.1/configure 2005-02-11 19:53:33.000000000 +0200 @@ -1826,7 +1826,7 @@ # Define the identity of the package. PACKAGE=dbus - VERSION=0.23 + VERSION=0.23.1 cat >>confdefs.h <<_ACEOF diff -ur dbus-0.23/configure.in dbus-0.23.1/configure.in --- dbus-0.23/configure.in 2005-01-13 00:20:40.000000000 +0200 +++ dbus-0.23.1/configure.in 2005-02-11 19:53:09.000000000 +0200 @@ -3,7 +3,7 @@ AC_INIT(dbus/dbus.h) -AM_INIT_AUTOMAKE(dbus, 0.23) +AM_INIT_AUTOMAKE(dbus, 0.23.1) AM_CONFIG_HEADER(config.h) diff -ur dbus-0.23/dbus/dbus-connection.c dbus-0.23.1/dbus/dbus-connection.c --- dbus-0.23/dbus/dbus-connection.c 2005-01-11 21:31:56.000000000 +0200 +++ dbus-0.23.1/dbus/dbus-connection.c 2005-02-11 19:52:47.000000000 +0200 @@ -358,9 +358,10 @@ _dbus_connection_wakeup_mainloop (connection); - _dbus_verbose ("Message %p (%d %s %s '%s') added to incoming queue %p, %d incoming\n", + _dbus_verbose ("Message %p (%d %s %s %s '%s') added to incoming queue %p, %d incoming\n", message, dbus_message_get_type (message), + dbus_message_get_path (message), dbus_message_get_interface (message) ? dbus_message_get_interface (message) : "no interface", @@ -473,9 +474,10 @@ connection->n_outgoing -= 1; - _dbus_verbose ("Message %p (%d %s %s '%s') removed from outgoing queue %p, %d left to send\n", + _dbus_verbose ("Message %p (%d %s %s %s '%s') removed from outgoing queue %p, %d left to send\n", message, dbus_message_get_type (message), + dbus_message_get_path (message), dbus_message_get_interface (message) ? dbus_message_get_interface (message) : "no interface", @@ -1572,9 +1574,10 @@ } #endif - _dbus_verbose ("Message %p (%d %s %s '%s') added to outgoing queue %p, %d pending to send\n", + _dbus_verbose ("Message %p (%d %s %s %s '%s') added to outgoing queue %p, %d pending to send\n", message, dbus_message_get_type (message), + dbus_message_get_path (message), dbus_message_get_interface (message) ? dbus_message_get_interface (message) : "no interface", @@ -1606,12 +1609,30 @@ _dbus_connection_do_iteration (connection, DBUS_ITERATION_DO_WRITING, -1); - + /* If stuff is still queued up, be sure we wake up the main loop */ if (connection->n_outgoing > 0) _dbus_connection_wakeup_mainloop (connection); } +static void +_dbus_connection_send_preallocated_and_unlock (DBusConnection *connection, + DBusPreallocatedSend *preallocated, + DBusMessage *message, + dbus_uint32_t *client_serial) +{ + DBusDispatchStatus status; + + _dbus_connection_send_preallocated_unlocked (connection, + preallocated, + message, client_serial); + + status = _dbus_connection_get_dispatch_status_unlocked (connection); + + /* this calls out to user code */ + _dbus_connection_update_dispatch_status_and_unlock (connection, status); +} + /** * Sends a message using preallocated resources. This function cannot fail. * It works identically to dbus_connection_send() in other respects. @@ -1642,10 +1663,9 @@ dbus_message_get_member (message) != NULL)); CONNECTION_LOCK (connection); - _dbus_connection_send_preallocated_unlocked (connection, - preallocated, - message, client_serial); - CONNECTION_UNLOCK (connection); + _dbus_connection_send_preallocated_and_unlock (connection, + preallocated, + message, client_serial); } static dbus_bool_t @@ -1670,6 +1690,27 @@ return TRUE; } +static dbus_bool_t +_dbus_connection_send_and_unlock (DBusConnection *connection, + DBusMessage *message, + dbus_uint32_t *client_serial) +{ + DBusPreallocatedSend *preallocated; + + _dbus_assert (connection != NULL); + _dbus_assert (message != NULL); + + preallocated = _dbus_connection_preallocate_send_unlocked (connection); + if (preallocated == NULL) + return FALSE; + + _dbus_connection_send_preallocated_and_unlock (connection, + preallocated, + message, + client_serial); + return TRUE; +} + /** * Adds a message to the outgoing message queue. Does not block to * write the message to the network; that happens asynchronously. To @@ -1698,14 +1739,9 @@ CONNECTION_LOCK (connection); - if (!_dbus_connection_send_unlocked (connection, message, client_serial)) - { - CONNECTION_UNLOCK (connection); - return FALSE; - } - - CONNECTION_UNLOCK (connection); - return TRUE; + return _dbus_connection_send_and_unlock (connection, + message, + client_serial); } static dbus_bool_t @@ -1784,6 +1820,7 @@ DBusMessage *reply; DBusList *reply_link; dbus_int32_t serial = -1; + DBusDispatchStatus status; _dbus_return_val_if_fail (connection != NULL, FALSE); _dbus_return_val_if_fail (message != NULL, FALSE); @@ -1845,8 +1882,11 @@ else dbus_pending_call_unref (pending); - 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); + return TRUE; error: @@ -2256,9 +2296,10 @@ link = _dbus_list_pop_first_link (&connection->incoming_messages); connection->n_incoming -= 1; - _dbus_verbose ("Message %p (%d %s %s '%s') removed from incoming queue %p, %d incoming\n", + _dbus_verbose ("Message %p (%d %s %s %s '%s') removed from incoming queue %p, %d incoming\n", link->data, dbus_message_get_type (link->data), + dbus_message_get_path (link->data), dbus_message_get_interface (link->data) ? dbus_message_get_interface (link->data) : "no interface", diff -ur dbus-0.23/mono/Service.cs dbus-0.23.1/mono/Service.cs --- dbus-0.23/mono/Service.cs 2004-08-31 06:59:14.000000000 +0300 +++ dbus-0.23.1/mono/Service.cs 2005-02-11 19:52:47.000000000 +0200 @@ -23,6 +23,9 @@ private static AssemblyBuilder proxyAssembly; private ModuleBuilder module = null; + // Add a match for signals. FIXME: Can we filter the service? + private const string MatchRule = "type='signal'"; + internal Service(string name, Connection connection) { this.name = name; @@ -47,6 +50,12 @@ this.local = true; } + ~Service () + { + if (this.filterCalled != null) + RemoveFilter (); + } + public static bool Exists(Connection connection, string name) { Error error = new Error(); @@ -113,9 +122,17 @@ IntPtr.Zero)) throw new OutOfMemoryException(); - // Add a match for signals. FIXME: Can we filter the service? - string rule = "type='signal'"; - dbus_bus_add_match(connection.RawConnection, rule, IntPtr.Zero); + dbus_bus_add_match(connection.RawConnection, MatchRule, IntPtr.Zero); + } + + private void RemoveFilter() + { + dbus_connection_remove_filter (Connection.RawConnection, + this.filterCalled, + IntPtr.Zero); + this.filterCalled = null; + + dbus_bus_remove_match (connection.RawConnection, MatchRule, IntPtr.Zero); } private int Service_FilterCalled(IntPtr rawConnection, @@ -200,9 +217,19 @@ IntPtr freeData); [DllImport("dbus-1")] + private extern static void dbus_connection_remove_filter(IntPtr rawConnection, + DBusHandleMessageFunction filter, + IntPtr userData); + + [DllImport("dbus-1")] private extern static void dbus_bus_add_match(IntPtr rawConnection, string rule, IntPtr erro); + [DllImport("dbus-1")] + private extern static void dbus_bus_remove_match(IntPtr rawConnection, + string rule, + IntPtr erro); + } }