dbus/mono Service.cs,1.7,1.7.2.1

Joe Shaw joe at freedesktop.org
Thu Feb 10 15:22:13 PST 2005


Update of /cvs/dbus/dbus/mono
In directory gabe:/tmp/cvs-serv20453/mono

Modified Files:
      Tag: dbus-0-23
	Service.cs 
Log Message:
2005-02-10  Joe Shaw  <joeshaw at 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.

Index: Service.cs
===================================================================
RCS file: /cvs/dbus/dbus/mono/Service.cs,v
retrieving revision 1.7
retrieving revision 1.7.2.1
diff -u -d -r1.7 -r1.7.2.1
--- Service.cs	31 Aug 2004 03:59:14 -0000	1.7
+++ Service.cs	10 Feb 2005 23:22:11 -0000	1.7.2.1
@@ -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);
+
   }
 }



More information about the dbus-commit mailing list