diff options
author | Michel Dänzer <mdaenzer@redhat.com> | 2020-06-19 18:10:18 +0200 |
---|---|---|
committer | Olivier Fourdan <fourdan@gmail.com> | 2020-07-20 13:22:21 +0000 |
commit | 22c0808ac88f917541fe40ab30e85364adac82bc (patch) | |
tree | e10752421ec9c860eaeef00a4bfc9ff85611ed2a | |
parent | 37779d7f4028e94c8383a937eab57a6ffb15c38b (diff) |
xwayland: Free all remaining events in xwl_present_cleanup
At the end of xwl_present_cleanup, these events aren't reachable
anymore, so if we don't free them first, they're leaked.
(cherry picked from commit 64565ea344fef0171497952ef75f019cb420fe3b)
v2:
* Simpler backport, no need to keep a reference to the pixmap on the
1.20 branch.
-rw-r--r-- | hw/xwayland/xwayland-present.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c index 492e4a876..2cec63f59 100644 --- a/hw/xwayland/xwayland-present.c +++ b/hw/xwayland/xwayland-present.c @@ -114,6 +114,12 @@ xwl_present_reset_timer(struct xwl_present_window *xwl_present_window) static void xwl_present_free_event(struct xwl_present_event *event) { + if (!event) + return; + + if (event->buffer) + wl_buffer_set_user_data(event->buffer, NULL); + xorg_list_del(&event->list); free(event); } @@ -138,21 +144,10 @@ xwl_present_cleanup(WindowPtr window) xorg_list_for_each_entry_safe(event, tmp, &xwl_present_window->event_list, list) xwl_present_free_event(event); - /* Clear remaining buffer releases and inform Present about free ressources */ - event = xwl_present_window->sync_flip; - xwl_present_window->sync_flip = NULL; - if (event) { - if (event->buffer_released) { - xwl_present_free_event(event); - } else { - event->pending = FALSE; - event->abort = TRUE; - } - } - xorg_list_for_each_entry_safe(event, tmp, &xwl_present_window->release_queue, list) { - xorg_list_del(&event->list); - event->abort = TRUE; - } + xwl_present_free_event(xwl_present_window->sync_flip); + + xorg_list_for_each_entry_safe(event, tmp, &xwl_present_window->release_queue, list) + xwl_present_free_event(event); /* Clear timer */ xwl_present_free_timer(xwl_present_window); @@ -353,6 +348,7 @@ xwl_present_queue_vblank(WindowPtr present_window, return BadAlloc; event->event_id = event_id; + event->buffer = NULL; event->xwl_present_window = xwl_present_window; event->target_msc = msc; |