[PATCH weston] libweston-desktop: fix stale ping when a surface is destroyed
Quentin Glidic
sardemff7+wayland at sardemff7.net
Sat Sep 24 10:20:07 UTC 2016
On 23/09/2016 17:30, Giulio Camuffo wrote:
> When sending a ping event to a surface using the wl_shell interface,
> if that surface is destroyed before we receive the pong we will never
> receive it, even if the client is actually responsive, since the
> interface does not exist anymore. So when the surface if destroyed
> pretend it's a pong and reset the ping state.
Even if it is still internal, I do not like having weston_desktop_client
outside of client.c.
I would rather pretend the pong for real, as in, directly from
wl_shell.c in the destroy_surface callback. Do you think it could work?
Cheers,
> ---
> libweston-desktop/client.c | 14 ++++----------
> libweston-desktop/internal.h | 12 +++++++++++-
> libweston-desktop/surface.c | 4 ++++
> 3 files changed, 19 insertions(+), 11 deletions(-)
>
> diff --git a/libweston-desktop/client.c b/libweston-desktop/client.c
> index 29c3c98..ee8a2f8 100644
> --- a/libweston-desktop/client.c
> +++ b/libweston-desktop/client.c
> @@ -31,16 +31,6 @@
> #include "libweston-desktop.h"
> #include "internal.h"
>
> -struct weston_desktop_client {
> - struct weston_desktop *desktop;
> - struct wl_client *client;
> - struct wl_resource *resource;
> - struct wl_list surface_list;
> - uint32_t ping_serial;
> - struct wl_event_source *ping_timer;
> - struct wl_signal destroy_signal;
> -};
> -
> void
> weston_desktop_client_add_destroy_listener(struct weston_desktop_client *client,
> struct wl_listener *listener)
> @@ -75,6 +65,8 @@ static int
> weston_desktop_client_ping_timeout(void *user_data)
> {
> struct weston_desktop_client *client = user_data;
> + if (client->ping_serial == 0)
> + return 1;
>
> weston_desktop_api_ping_timeout(client->desktop, client);
> return 1;
> @@ -192,6 +184,7 @@ weston_desktop_client_ping(struct weston_desktop_client *client)
>
> client->ping_serial =
> wl_display_next_serial(wl_client_get_display(client->client));
> + client->ping_surface = surface;
> wl_event_source_timer_update(client->ping_timer, 10000);
>
> implementation->ping(surface, client->ping_serial, implementation_data);
> @@ -209,4 +202,5 @@ weston_desktop_client_pong(struct weston_desktop_client *client, uint32_t serial
>
> wl_event_source_timer_update(client->ping_timer, 0);
> client->ping_serial = 0;
> + client->ping_surface = NULL;
> }
> diff --git a/libweston-desktop/internal.h b/libweston-desktop/internal.h
> index a9c974b..7a4e6b2 100644
> --- a/libweston-desktop/internal.h
> +++ b/libweston-desktop/internal.h
> @@ -27,7 +27,17 @@
> #include "compositor.h"
>
> struct weston_desktop_seat;
> -struct weston_desktop_client;
> +
> +struct weston_desktop_client {
> + struct weston_desktop *desktop;
> + struct wl_client *client;
> + struct wl_resource *resource;
> + struct wl_list surface_list;
> + uint32_t ping_serial;
> + struct weston_desktop_surface *ping_surface;
> + struct wl_event_source *ping_timer;
> + struct wl_signal destroy_signal;
> +};
>
> struct weston_compositor *
> weston_desktop_get_compositor(struct weston_desktop *desktop);
> diff --git a/libweston-desktop/surface.c b/libweston-desktop/surface.c
> index 2205107..e448280 100644
> --- a/libweston-desktop/surface.c
> +++ b/libweston-desktop/surface.c
> @@ -127,6 +127,10 @@ weston_desktop_surface_destroy(struct weston_desktop_surface *surface)
> {
> struct weston_desktop_view *view, *next_view;
> struct weston_desktop_surface *child, *next_child;
> + struct weston_desktop_client *client = surface->client;
> +
> + if (client->ping_surface == surface)
> + weston_desktop_client_pong(client, client->ping_serial);
>
> wl_list_remove(&surface->surface_commit_listener.link);
> wl_list_remove(&surface->surface_destroy_listener.link);
>
--
Quentin “Sardem FF7” Glidic
More information about the wayland-devel
mailing list