On disconnect, HAL doesn't unregister the DBus match rule.
After a lot of server generations, we exceed the number of match rules
allowed for a DBus connection:

[config/hal] couldn't add match rule: org.freedesktop.DBus.Error.LimitsExceeded
(Connection ":1.34" is not allowed to add more match rules (increase limits in
configuration file if required))
[config/hal] cannot detect a HAL startup.

X.Org Bug 27681 <http://bugs.freedesktop.org/show_bug.cgi?id=27681>

Signed-off-by: Peter Hutterer <[email protected]>
---
Testcase: run xdpyinfo in a loop.

 config/hal.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/config/hal.c b/config/hal.c
index d3daa84..bb83761 100644
--- a/config/hal.c
+++ b/config/hal.c
@@ -43,6 +43,12 @@
 #define LIBHAL_PROP_KEY "input.x11_options."
 #define LIBHAL_XKB_PROP_KEY "input.xkb."
 
+static const char MATCH_RULE[] = "sender='org.freedesktop.DBus',"
+                                 "interface='org.freedesktop.DBus',"
+                                 "type='signal',"
+                                 "path='/org/freedesktop/DBus',"
+                                 "member='NameOwnerChanged'";
+
 
 struct config_hal_info {
     DBusConnection *system_bus;
@@ -429,6 +435,8 @@ disconnect_hook(void *data)
             if (!libhal_ctx_shutdown(info->hal_ctx, &error))
                 LogMessage(X_WARNING, "config/hal: disconnect_hook couldn't 
shut down context: %s (%s)\n",
                         error.name, error.message);
+
+            dbus_bus_remove_match(info->system_bus, MATCH_RULE, &error);
             dbus_error_free(&error);
         }
         libhal_ctx_free(info->hal_ctx);
@@ -574,11 +582,6 @@ listen_for_startup(DBusConnection *connection, void *data)
 {
     DBusObjectPathVTable vtable = { .message_function = ownerchanged_handler, 
};
     DBusError error;
-    const char MATCH_RULE[] = "sender='org.freedesktop.DBus',"
-                              "interface='org.freedesktop.DBus',"
-                              "type='signal',"
-                              "path='/org/freedesktop/DBus',"
-                              "member='NameOwnerChanged'";
     int rc = FALSE;
 
     dbus_error_init(&error);
@@ -643,5 +646,6 @@ config_hal_init(void)
 void
 config_hal_fini(void)
 {
+    disconnect_hook(&hal_info);
     config_dbus_core_remove_hook(&hook);
 }
-- 
1.6.6.1

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to