[PATCH weston 2/8] libweston: Make weston_keyboard destruction safe

Pekka Paalanen ppaalanen at gmail.com
Wed Jan 31 11:29:54 UTC 2018


On Fri, 26 Jan 2018 18:47:56 +0200
Alexandros Frantzis <alexandros.frantzis at collabora.com> wrote:

> Ensure the server can safely handle client requests for wl_keyboard
> resources that have become inert due to a weston_keyboard object
> destruction.
> 
> This change involves, among other things, setting the weston_keyboard
> object, instead of the weston_seat object, as the user data for
> wl_keyboard resources.  Although this is not strictly required at the
> moment (since no code is using the wl_keyboard user data), it makes the
> code safer:
> 
>  * It makes more sense conceptually.
>  * It is consistent with how wl_pointer resources are handled.
>  * It allows us to clear the user data during weston_keyboard
>    destruction, so other code can check whether the resource is inert.
> 
> Signed-off-by: Alexandros Frantzis <alexandros.frantzis at collabora.com>
> ---
>  libweston/input.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/libweston/input.c b/libweston/input.c
> index 01f0d568..96cabf25 100644
> --- a/libweston/input.c
> +++ b/libweston/input.c
> @@ -1166,7 +1166,18 @@ weston_xkb_info_destroy(struct weston_xkb_info *xkb_info);
>  WL_EXPORT void
>  weston_keyboard_destroy(struct weston_keyboard *keyboard)
>  {
> -	/* XXX: What about keyboard->resource_list? */
> +	struct wl_resource *resource;
> +
> +	wl_resource_for_each(resource, &keyboard->resource_list) {
> +		wl_resource_set_user_data(resource, NULL);
> +	}
> +
> +	wl_resource_for_each(resource, &keyboard->focus_resource_list) {
> +		wl_resource_set_user_data(resource, NULL);
> +	}
> +
> +	wl_list_remove(&keyboard->resource_list);
> +	wl_list_remove(&keyboard->focus_resource_list);
>  
>  	xkb_state_unref(keyboard->xkb_state.state);
>  	if (keyboard->xkb_info)
> @@ -2504,7 +2515,7 @@ seat_get_keyboard(struct wl_client *client, struct wl_resource *resource,
>  	 * focused */
>  	wl_list_insert(&keyboard->resource_list, wl_resource_get_link(cr));
>  	wl_resource_set_implementation(cr, &keyboard_interface,
> -				       seat, unbind_resource);
> +				       keyboard, unbind_resource);
>  
>  	if (wl_resource_get_version(cr) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION) {
>  		wl_keyboard_send_repeat_info(cr,

This was easy, cool.

Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>


Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20180131/d3912d53/attachment.sig>


More information about the wayland-devel mailing list