diff options
author | Joe Shaw <joeshaw@novell.com> | 2005-02-10 23:01:28 +0000 |
---|---|---|
committer | Joe Shaw <joeshaw@novell.com> | 2005-02-10 23:01:28 +0000 |
commit | fd146b370dd2e014838c08ce0bfc8854ca93928b (patch) | |
tree | df200b603d67e486edf2a50bb763e4343c1a9f9d /mono | |
parent | 8fda602e991990d21f196e65d917a481c6ec1360 (diff) |
2005-02-10 Joe Shaw <joeshaw@novell.com>
* 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.
Diffstat (limited to 'mono')
-rw-r--r-- | mono/Service.cs | 33 |
1 files changed, 30 insertions, 3 deletions
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, @@ -200,9 +217,19 @@ namespace DBus 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); + } } |