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);
 

Reply via email to