mirror of
https://gitlab.freedesktop.org/xorg/lib/libx11.git
synced 2026-05-07 06:18:04 +02:00
Fix hanging issue in _XReply
Assume event queue is empty if another thread is blocking waiting for event. If one thread was blocking waiting for an event and another thread sent a reply to the X server, both threads got blocked until an event was received. Signed-off-by: Tatu Frisk <tatu.frisk@ge.com> Signed-off-by: Jose Alarcon <jose.alarcon@ge.com>
This commit is contained in:
parent
8382253010
commit
93a050c3ad
1 changed files with 8 additions and 12 deletions
20
src/xcb_io.c
20
src/xcb_io.c
|
|
@ -704,18 +704,14 @@ Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard)
|
|||
if(dpy->xcb->event_owner == XlibOwnsEventQueue)
|
||||
{
|
||||
xcb_generic_reply_t *event;
|
||||
/* If some thread is already waiting for events,
|
||||
* it will get the first one. That thread must
|
||||
* process that event before we can continue. */
|
||||
/* FIXME: That event might be after this reply,
|
||||
* and might never even come--or there might be
|
||||
* multiple threads trying to get events. */
|
||||
while(dpy->xcb->event_waiter)
|
||||
{ /* need braces around ConditionWait */
|
||||
ConditionWait(dpy, dpy->xcb->event_notify);
|
||||
}
|
||||
while((event = poll_for_event(dpy, True)))
|
||||
handle_response(dpy, event, True);
|
||||
|
||||
/* Assume event queue is empty if another thread is blocking
|
||||
* waiting for event. */
|
||||
if(!dpy->xcb->event_waiter)
|
||||
{
|
||||
while((event = poll_for_response(dpy)))
|
||||
handle_response(dpy, event, True);
|
||||
}
|
||||
}
|
||||
|
||||
req->reply_waiter = 0;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue