mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-30 23:28:06 +02:00
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: 7b0e8264dd "loader/dri3: Try to make sure we only process our
own NotifyMSC events"
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5368>
This commit is contained in:
parent
ee77951714
commit
7c226116c6
1 changed files with 1 additions and 7 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue