[PATCH xcb] Fix hanging issue in _XReply

Ian Ray ian.ray at ge.com
Fri Jan 5 14:49:49 UTC 2018


From: Tatu Frisk <tatu.frisk at ge.com>

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 at ge.com>
Signed-off-by: Jose Alarcon <jose.alarcon at ge.com>
Signed-off-by: Ian Ray <ian.ray at ge.com>
---
 src/xcb_io.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/src/xcb_io.c b/src/xcb_io.c
index 649c820..4a8bb27 100644
--- a/src/xcb_io.c
+++ b/src/xcb_io.c
@@ -607,18 +607,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);
+
+			/* 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);
 			}
-			while((event = poll_for_event(dpy)))
-				handle_response(dpy, event, True);
 		}
 
 		req->reply_waiter = 0;
-- 
2.10.1



More information about the xorg-devel mailing list