[PATCH v2 2/3] present: clean up all current flip resources on window destruction

Frank Binns frank.binns at imgtec.com
Wed May 28 09:40:30 PDT 2014


When a flip event is received the associated resources are transferred
from the vblank data, which gets destroyed, to the screen private data.
Usually, the resources would be cleaned up when a new flip event is
received or an unflip is completed.

In the case of normal client termination it's expected that an unflip
will be performed. However, if the client terminates abnormally it's
possible that this will not happen meaning some of the resources are
leaked. This is avoided by cleaning up these resources at window
destruction time.

Signed-off-by: Frank Binns <frank.binns at imgtec.com>
---
 present/present.c        | 14 +-------------
 present/present_priv.h   |  2 +-
 present/present_screen.c |  7 ++++---
 3 files changed, 6 insertions(+), 17 deletions(-)

diff --git a/present/present.c b/present/present.c
index dbd60cc..a717d0d 100644
--- a/present/present.c
+++ b/present/present.c
@@ -293,7 +293,7 @@ present_window_to_crtc_msc(WindowPtr window, RRCrtcPtr crtc, uint64_t window_msc
     return window_msc + window_priv->msc_offset;
 }
 
-static void
+void
 present_flip_idle(ScreenPtr screen)
 {
     present_screen_priv_ptr screen_priv = present_screen_priv(screen);
@@ -878,18 +878,6 @@ present_notify_msc(WindowPtr window,
 }
 
 void
-present_flip_destroy(ScreenPtr screen)
-{
-    present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
-
-    /* XXX this needs to be synchronous for server reset */
-
-    /* Do the actual cleanup once the flip has been performed by the hardware */
-    if (screen_priv->flip_pending)
-        present_set_abort_flip(screen);
-}
-
-void
 present_vblank_destroy(present_vblank_ptr vblank)
 {
     /* Remove vblank from window and screen lists */
diff --git a/present/present_priv.h b/present/present_priv.h
index 8d3e007..49276ba 100644
--- a/present/present_priv.h
+++ b/present/present_priv.h
@@ -181,7 +181,7 @@ void
 present_vblank_destroy(present_vblank_ptr vblank);
 
 void
-present_flip_destroy(ScreenPtr screen);
+present_flip_idle(ScreenPtr screen);
 
 void
 present_check_flip_window(WindowPtr window);
diff --git a/present/present_screen.c b/present/present_screen.c
index 25ef681..2efcac7 100644
--- a/present/present_screen.c
+++ b/present/present_screen.c
@@ -57,7 +57,8 @@ present_close_screen(ScreenPtr screen)
 {
     present_screen_priv_ptr screen_priv = present_screen_priv(screen);
 
-    present_flip_destroy(screen);
+    assert (!screen_priv->flip_pending);
+    assert (!screen_priv->flip_pixmap);
 
     unwrap(screen_priv, screen, CloseScreen);
     (*screen->CloseScreen) (screen);
@@ -92,10 +93,10 @@ present_clear_window_flip(WindowPtr window)
 
     if (flip_pending && flip_pending->window == window) {
         assert (flip_pending->abort_flip);
-        flip_pending->window = NULL;
+        screen_priv->flip_pending = NULL;
     }
     if (screen_priv->flip_window == window)
-        screen_priv->flip_window = NULL;
+        present_flip_idle(screen);
 }
 
 /*
-- 
1.8.5.4.gfdaaaa2



More information about the xorg-devel mailing list