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. We don't care about the error by dbus_bus_remove_match because we won't do anything about it anyway. It is only provided to force dbus to flush. X.Org Bug 27681 <http://bugs.freedesktop.org/show_bug.cgi?id=27681> Signed-off-by: Peter Hutterer <[email protected]> Acked-by: Daniel Stone <[email protected]> --- just so the patch is archived on the list. config/hal.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) diff --git a/config/hal.c b/config/hal.c index d3daa84..89c5ea4 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; @@ -426,6 +432,8 @@ disconnect_hook(void *data) if (info->hal_ctx) { if (dbus_connection_get_is_connected(info->system_bus)) { dbus_error_init(&error); + dbus_bus_remove_match(info->system_bus, MATCH_RULE, &error); + dbus_error_free(&error); 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); @@ -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
