summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Shaw <joe@novell.com>2005-02-10 23:01:27 +0000
committerJohn Palmieri <johnp@remedyz.boston.redhat.com>2006-06-28 08:15:40 -0400
commit9e977cfdfbca8334be92bae678737b02e4ec7eeb (patch)
tree5ff5b824b524ae8ae2e9f94a68de4fb4a7082788
parent94ec32a3e7f46d9327d855666df0c944b987d334 (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.
-rw-r--r--mono/Service.cs33
1 files changed, 30 insertions, 3 deletions
diff --git a/mono/Service.cs b/mono/Service.cs
index 5f6ff4c..b554796 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);
+
}
}