[PATCH weston] compositor: rebuild the global list if we've removed a surface from it

Pekka Paalanen ppaalanen at gmail.com
Sat Jul 6 01:55:20 PDT 2013


On Wed, 26 Jun 2013 18:08:46 +0100
Rob Bradford <robert.bradford at intel.com> wrote:

> From: Rob Bradford <rob at linux.intel.com>
> 
> The list of surfaces used by weston_compositor_pick_surface() is
> maintained in list of surfaces stored on the compositor. This list is
> generated from the surfaces across all the layers using
> weston_compositor_build_surface_list.
> 
> When destroying a surface the surface is "unmapped" with
> weston_surface_unmap which removes it from the layer list. However since
> the compositor surface list was only being rebuilt when the output was
> repainted a call to weston_compositor_pick_surface before the next
> output repaint would use an outdated surface list containing surfaces
> that have been partially destroyed.
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=65986
> ---
>  src/compositor.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/src/compositor.c b/src/compositor.c
> index 43d8965..0a8cfff 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -93,6 +93,9 @@ static void
>  weston_output_transform_scale_init(struct weston_output *output,
>  				   uint32_t transform, uint32_t scale);
>  
> +static void
> +weston_compositor_build_surface_list(struct weston_compositor *compositor);
> +
>  WL_EXPORT int
>  weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode, int32_t scale)
>  {
> @@ -1011,8 +1014,10 @@ weston_surface_destroy(struct weston_surface *surface)
>  	assert(wl_list_empty(&surface->subsurface_list_pending));
>  	assert(wl_list_empty(&surface->subsurface_list));
>  
> -	if (weston_surface_is_mapped(surface))
> +	if (weston_surface_is_mapped(surface)) {
>  		weston_surface_unmap(surface);
> +		weston_compositor_build_surface_list(compositor);
> +	}
>  
>  	wl_list_for_each_safe(cb, next,
>  			      &surface->pending.frame_callback_list, link)

Hi Rob,

what would be wrong with simply removing the surface from the big
flat list? Could the order of remaining surfaces in layers change?

Wouldn't it make more sense for weston_surface_unmap() to
unconditionally remove the surface not only from layers, but the
flat list too? You may need to verify, that weston_surface::link is
kept valid at all times.

Though, I guess this is just a stop-gap measure for now?


Thanks,
pq


More information about the wayland-devel mailing list