[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