On Fri, 2018-01-05 at 16:49 +0200, Ian Ray wrote:
> From: Tatu Frisk <tatu.fr...@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.fr...@ge.com>
> Signed-off-by: Jose Alarcon <jose.alar...@ge.com>
> Signed-off-by: Ian Ray <ian....@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;
_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to