diff options
author | marha <marha@users.sourceforge.net> | 2011-03-15 22:49:12 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2011-03-15 22:49:12 +0000 |
commit | 8285341e69cd721c6871b553e45437c767200545 (patch) | |
tree | 551508bddc84d1c16c15d961878cd2d2f6edb365 /libX11/src/xcb_io.c | |
parent | 52b8618bfdaa4725fc403f50fe682d02e7f16435 (diff) | |
parent | 5e633abcca598289d0423d89bb400b41e6417259 (diff) | |
download | vcxsrv-8285341e69cd721c6871b553e45437c767200545.tar.gz vcxsrv-8285341e69cd721c6871b553e45437c767200545.tar.bz2 vcxsrv-8285341e69cd721c6871b553e45437c767200545.zip |
svn merge ^/branches/released .
Diffstat (limited to 'libX11/src/xcb_io.c')
-rw-r--r-- | libX11/src/xcb_io.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libX11/src/xcb_io.c b/libX11/src/xcb_io.c index 6a2172bdb..9f49cdd50 100644 --- a/libX11/src/xcb_io.c +++ b/libX11/src/xcb_io.c @@ -343,7 +343,15 @@ void _XReadEvents(Display *dpy) dpy->xcb->event_waiter = 1;
UnlockDisplay(dpy);
event = xcb_wait_for_event(dpy->xcb->connection);
- InternalLockDisplay(dpy, /* don't skip user locks */ 0);
+ /* It appears that classic Xlib respected user
+ * locks when waking up after waiting for
+ * events. However, if this thread did not have
+ * any user locks, and another thread takes a
+ * user lock and tries to read events, then we'd
+ * deadlock. So we'll choose to let the thread
+ * that got in first consume events, despite the
+ * later thread's user locks. */
+ InternalLockDisplay(dpy, /* ignore user locks */ 1);
dpy->xcb->event_waiter = 0;
ConditionBroadcast(dpy, dpy->xcb->event_notify);
if(!event)
@@ -534,7 +542,10 @@ Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard) req->reply_waiter = 1;
UnlockDisplay(dpy);
response = xcb_wait_for_reply(c, req->sequence, &error);
- InternalLockDisplay(dpy, /* don't skip user locks */ 0);
+ /* Any user locks on another thread must have been taken
+ * while we slept in xcb_wait_for_reply. Classic Xlib
+ * ignored those user locks in this case, so we do too. */
+ InternalLockDisplay(dpy, /* ignore user locks */ 1);
/* We have the response we're looking for. Now, before
* letting anyone else process this sequence number, we
|