Module: Mesa Branch: staging/22.3 Commit: 31ae943d21bc58e472f7fcbad5fb2a616ae7833e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=31ae943d21bc58e472f7fcbad5fb2a616ae7833e
Author: Yuxuan Shui <[email protected]> Date: Mon Feb 6 01:22:47 2023 +0000 loader: unregister special event in loader_dri3_drawable_fini This was inadvertently removed in 98a6cfd3953 and causes continuous memory leaks as events are being received after the context has been unbound. Fixes: 3170b63314f ("loader: Add infrastructure for tracking active CRTC resources") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8238 Signed-off-by: Yuxuan Shui <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21128> (cherry picked from commit 27a89a0903f2c541541846e8d909bb67af242d5e) --- .pick_status.json | 2 +- src/loader/loader_dri3_helper.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index a35642423f5..c070b98a14c 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -157,7 +157,7 @@ "description": "loader: unregister special event in loader_dri3_drawable_fini", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "3170b63314f14f0031cb95bd5ee3a4726f26b43b" }, diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 5a97ce302a0..ad6f0b624b3 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -359,6 +359,15 @@ loader_dri3_drawable_fini(struct loader_dri3_drawable *draw) dri3_free_render_buffer(draw, draw->buffers[i]); } + if (draw->special_event) { + xcb_void_cookie_t cookie = + xcb_present_select_input_checked(draw->conn, draw->eid, draw->drawable, + XCB_PRESENT_EVENT_MASK_NO_EVENT); + + xcb_discard_reply(draw->conn, cookie.sequence); + xcb_unregister_for_special_event(draw->conn, draw->special_event); + } + if (draw->region) xcb_xfixes_destroy_region(draw->conn, draw->region);
