[PATCH weston 1/2] shell: Fix memory leaks caused by the window close animation

Ander Conselvan de Oliveira ander.conselvan.de.oliveira at intel.com
Tue Apr 29 07:54:02 PDT 2014


In order to do the window close animation, a reference for a destroyed
surface is kept. However, the reference count was also increased for
unmapped surfaces, in which case the animation wouldn't run. Since the
reference count was decremented in the animation done function, it would
never be decreased for unmapped surfaces, causing them to not be
released.

The close animation also changed how shell surfaces are released. The
destroy function for its resource was changed to not deallocate the
surface, and instead keep it around until the animation finishes and
the weston surface is destroyed. The destruction should happen in the
destroy listener for the weston surface, but it wouldn't destroy the
shell surface in the case the resource was still valid, assuming that
it would be freed in the resource destroy function.
---
 desktop-shell/shell.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index bc4a258..6fc797b 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -3081,8 +3081,8 @@ shell_handle_surface_destroy(struct wl_listener *listener, void *data)
 
 	if (shsurf->resource)
 		wl_resource_destroy(shsurf->resource);
-	else
-		destroy_shell_surface(shsurf);
+
+	destroy_shell_surface(shsurf);
 }
 
 static void
@@ -3100,15 +3100,17 @@ handle_resource_destroy(struct wl_listener *listener, void *data)
 		container_of(listener, struct shell_surface,
 			     resource_destroy_listener);
 
+	if (!weston_surface_is_mapped(shsurf->surface))
+		return;
+
 	shsurf->surface->ref_count++;
 
 	pixman_region32_fini(&shsurf->surface->pending.input);
 	pixman_region32_init(&shsurf->surface->pending.input);
 	pixman_region32_fini(&shsurf->surface->input);
 	pixman_region32_init(&shsurf->surface->input);
-	if (weston_surface_is_mapped(shsurf->surface))
-		weston_fade_run(shsurf->view, 1.0, 0.0, 300.0,
-				fade_out_done, shsurf);
+	weston_fade_run(shsurf->view, 1.0, 0.0, 300.0,
+			fade_out_done, shsurf);
 }
 
 static void
-- 
1.8.3.2



More information about the wayland-devel mailing list