From fd146b370dd2e014838c08ce0bfc8854ca93928b Mon Sep 17 00:00:00 2001 From: Joe Shaw Date: Thu, 10 Feb 2005 23:01:28 +0000 Subject: 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. --- mono/Service.cs | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'mono') diff --git a/mono/Service.cs b/mono/Service.cs index 5f6ff4c4..b5547961 100644 --- a/mono/Service.cs +++ b/mono/Service.cs @@ -23,6 +23,9 @@ namespace DBus 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 @@ namespace DBus this.local = true; } + ~Service () + { + if (this.filterCalled != null) + RemoveFilter (); + } + public static bool HasOwner(Connection connection, string name) { Error error = new Error(); @@ -113,9 +122,17 @@ namespace DBus 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, @@ -199,10 +216,20 @@ namespace DBus IntPtr userData, 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); + } } -- cgit