diff options
author | Jamey Sharp <jamey@minilop.net> | 2007-11-05 15:58:40 -0800 |
---|---|---|
committer | Jamey Sharp <jamey@minilop.net> | 2007-11-05 15:58:40 -0800 |
commit | e9f909add84681acb2917839b8890df081326a1b (patch) | |
tree | 4b10698d90f92e81d2d2d8215f439a5be670b429 /src/xcb_conn.c | |
parent | 9b9f9f6ae111ef8cc654a77f389207006ae2c90c (diff) | |
parent | 3c6c8f127c2bce4f45bface7dd45cc719af9de0d (diff) |
Merge branch 'master' into debian
Diffstat (limited to 'src/xcb_conn.c')
-rw-r--r-- | src/xcb_conn.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/src/xcb_conn.c b/src/xcb_conn.c index 3b315bc..e7856c3 100644 --- a/src/xcb_conn.c +++ b/src/xcb_conn.c @@ -62,6 +62,9 @@ static int set_fd_flags(const int fd) static int _xcb_xlib_init(_xcb_xlib *xlib) { xlib->lock = 0; +#ifndef NDEBUG + xlib->sloppy_lock = (getenv("LIBXCB_ALLOW_SLOPPY_LOCK") != 0); +#endif pthread_cond_init(&xlib->cond, 0); return 1; } @@ -285,15 +288,33 @@ void _xcb_unlock_io(xcb_connection_t *c) pthread_mutex_unlock(&c->iolock); } +void _xcb_wait_io(xcb_connection_t *c, pthread_cond_t *cond) +{ + int xlib_locked = c->xlib.lock; + if(xlib_locked) + { + c->xlib.lock = 0; + pthread_cond_broadcast(&c->xlib.cond); + } + pthread_cond_wait(cond, &c->iolock); + if(xlib_locked) + { + while(c->xlib.lock) + pthread_cond_wait(&c->xlib.cond, &c->iolock); + c->xlib.lock = 1; + c->xlib.thread = pthread_self(); + } +} + int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vector, int *count) { - int ret; + int ret, xlib_locked; fd_set rfds, wfds; /* If the thing I should be doing is already being done, wait for it. */ if(count ? c->out.writing : c->in.reading) { - pthread_cond_wait(cond, &c->iolock); + _xcb_wait_io(c, cond); return 1; } @@ -308,6 +329,12 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec ++c->out.writing; } + xlib_locked = c->xlib.lock; + if(xlib_locked) + { + c->xlib.lock = 0; + pthread_cond_broadcast(&c->xlib.cond); + } _xcb_unlock_io(c); do { ret = select(c->fd + 1, &rfds, &wfds, 0, 0); @@ -318,6 +345,11 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec ret = 0; } _xcb_lock_io(c); + if(xlib_locked) + { + c->xlib.lock = 1; + c->xlib.thread = pthread_self(); + } if(ret) { |