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
