[PATCH xcb] Fix hanging issue in _XReply

Adam Jackson ajax at nwnk.net
Wed Feb 14 21:38:02 UTC 2018


On Fri, 2018-01-05 at 16:49 +0200, Ian Ray wrote:
> 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>

I came across this patch again today. It looks correct to me but I
don't claim to fully understand libX11; it would be nice if an xcb
expert could take a look.

- ajax

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


More information about the xorg-devel mailing list