[PATCH weston] Copying xkb_info when creating a seat causes problems

Kristian Høgsberg krh at bitplanet.net
Wed Sep 4 11:29:37 PDT 2013


On Wed, Sep 4, 2013 at 5:49 AM, Andrew Wedgbury
<andrew.wedgbury at realvnc.com> wrote:
> A simpler fix would be to not call xkb_info_destroy() when releasing a seat in the case where the xkb_info for the seat was copied from the global compositor settings (which can be determined by checking if keymap_fd is the same)
>
> In this case, xkb_map_unref() should still be called to unref the keymap.
>
> This appears to fix things for me, so I can now create and destroy many seats.

Nice, the fix looks right.  I think the underlying problem is that the
way we share and create xkb_info is a little odd and I think we'd be
better off ref-counting the structure.  In weston_seat_init_keyboard,
we'd then do

  if (keymap != NULL) {
    seat->xkb_info = weston_xkb_info_create(keymap);
  } else {
    seat->xkb_info = seat->compositor->xkb_info;
    seat->xkb_info->ref_count++;
  }

and then rename xkb_info_destroy to weston_xkb_info_destroy() and make
it decrement ref_count and return immediately if it's > 0.

Kristian

> ---
>  src/input.c |    7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/src/input.c b/src/input.c
> index 325a48f..d99798e 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -1600,7 +1600,12 @@ weston_seat_release(struct weston_seat *seat)
>         if (seat->compositor->use_xkbcommon) {
>                 if (seat->xkb_state.state != NULL)
>                         xkb_state_unref(seat->xkb_state.state);
> -               xkb_info_destroy(&seat->xkb_info);
> +
> +               if (seat->xkb_info.keymap_fd !=
> +                   seat->compositor->xkb_info.keymap_fd)
> +                       xkb_info_destroy(&seat->xkb_info);
> +               else if (seat->xkb_info.keymap)
> +                       xkb_map_unref(seat->xkb_info.keymap);
>         }
>  #endif
>
> --
> 1.7.10.4
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list