As part of present's window destroy function, any vblanks associated with
the destroyed window are aborted and destroyed. However, this can include
a pending flip. This means that when the corresponding flip event is
finally processed it gets ignored. As a result, any deferred unflip is
never performed and, more importantly, the now idle pixmap is never
destroyed. This results in a leak between server resets.

Fix this by preventing any pending flip, associated with the window being
destroyed, from being aborted and destroyed during window destruction.

Signed-off-by: Frank Binns <[email protected]>
---
 present/present.c        | 3 ++-
 present/present_screen.c | 8 ++++++--
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/present/present.c b/present/present.c
index 2a96928..32160b9 100644
--- a/present/present.c
+++ b/present/present.c
@@ -354,7 +354,8 @@ present_unflip(ScreenPtr screen)
         present_set_tree_pixmap(screen_priv->flip_window,
                                   (*screen->GetScreenPixmap)(screen));
 
-    present_set_tree_pixmap(screen->root, (*screen->GetScreenPixmap)(screen));
+    if (screen->root)
+        present_set_tree_pixmap(screen->root, 
(*screen->GetScreenPixmap)(screen));
 
     /* Update the screen pixmap with the current flip pixmap contents
      */
diff --git a/present/present_screen.c b/present/present_screen.c
index 25ef681..693c827 100644
--- a/present/present_screen.c
+++ b/present/present_screen.c
@@ -71,12 +71,16 @@ present_close_screen(ScreenPtr screen)
 static void
 present_free_window_vblank(WindowPtr window)
 {
+    ScreenPtr                   screen = window->drawable.pScreen;
+    present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
     present_window_priv_ptr     window_priv = present_window_priv(window);
     present_vblank_ptr          vblank, tmp;
 
     xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->vblank, 
window_list) {
-        present_abort_vblank(window->drawable.pScreen, vblank->crtc, 
vblank->event_id, vblank->target_msc);
-        present_vblank_destroy(vblank);
+        if (vblank != screen_priv->flip_pending) {
+            present_abort_vblank(window->drawable.pScreen, vblank->crtc, 
vblank->event_id, vblank->target_msc);
+            present_vblank_destroy(vblank);
+        }
     }
 }
 
-- 
1.8.5.4.gfdaaaa2

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to