From 7c226116c6c0793d6d9a7dec52ac7cf54b82b57f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michel=20D=C3=A4nzer?= Date: Fri, 5 Jun 2020 18:22:31 +0200 Subject: [PATCH] loader/dri3: Use dri3_wait_for_event_locked in loader_dri3_wait_for_msc Before, if one thread ended up waiting in dri3_wait_for_event_locked and another one in loader_dri3_wait_for_msc at the same time, one thread could end up processing an event the other thread was waiting for, which could result in the latter thread waiting longer than necessary (possibly indefinitely). Noticed by inspection. v2: * Drop xcb_flush call from loader_dri3_wait_for_msc in favour of the one in dri3_wait_for_event_locked (Kenneth Graunke) Fixes: 7b0e8264dd21 "loader/dri3: Try to make sure we only process our own NotifyMSC events" Reviewed-by: Kenneth Graunke Part-of: --- src/loader/loader_dri3_helper.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 622c238d950..425faba8f64 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -577,22 +577,16 @@ loader_dri3_wait_for_msc(struct loader_dri3_drawable *draw, target_msc, divisor, remainder); - xcb_generic_event_t *ev; unsigned full_sequence; mtx_lock(&draw->mtx); - xcb_flush(draw->conn); /* Wait for the event */ do { - ev = xcb_wait_for_special_event(draw->conn, draw->special_event); - if (!ev) { + if (!dri3_wait_for_event_locked(draw, &full_sequence)) { mtx_unlock(&draw->mtx); return false; } - - full_sequence = ev->full_sequence; - dri3_handle_present_event(draw, (void *) ev); } while (full_sequence != cookie.sequence || draw->notify_msc < target_msc); *ust = draw->notify_ust; -- 2.30.2