[PATCH v2] config: unregister match rule on disconnect. (#27681)

Peter Hutterer peter.hutterer at who-t.net
Thu Apr 22 16:39:47 PDT 2010


On Wed, Apr 21, 2010 at 11:52:12AM +1000, Peter Hutterer wrote:
> 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 <peter.hutterer at who-t.net>
> Acked-by: Daniel Stone <daniel at fooishbar.org>
> ---

sigh. after some rather extensive testing yesterday, I can say that this
patch (and the first one) don't actually work even though it appeared so in
my first tests.

still don't know why it doesn't work since the register/unregister calls are
nicely paired up until it stops working. So there's either a dbus bug (which
I couldn't reproduce with a test case) or something else is askew.

Either way, I'm giving up on this. It only happens after 128 server
generations (or so), so it's a marginal issue anyway. If anyone wants to
scoop this up, be my guest.

Cheers,
  Peter


>  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
> 


More information about the xorg-devel mailing list