--- src/xcb_conn.c.orig 2007-03-03 17:05:12.000000000 +0100 +++ src/xcb_conn.c 2007-03-03 17:18:25.000000000 +0100 @@ -62,6 +62,11 @@ static int _xcb_xlib_init(_xcb_xlib *xlib) { xlib->lock = 0; + xlib->sloppy_lock = 0; + + if (getenv("LIBXCB_ALLOW_SLOPPY_LOCK")) + xlib->sloppy_lock = 1; + pthread_cond_init(&xlib->cond, 0); return 1; } --- src/xcbint.h.orig 2007-03-03 17:05:00.000000000 +0100 +++ src/xcbint.h 2007-03-03 17:10:33.000000000 +0100 @@ -130,6 +130,7 @@ typedef struct _xcb_xlib { int lock; + int sloppy_lock; pthread_t thread; pthread_cond_t cond; } _xcb_xlib; --- src/xcb_xlib.c.orig 2007-03-03 17:07:06.000000000 +0100 +++ src/xcb_xlib.c 2007-03-03 17:10:14.000000000 +0100 @@ -40,7 +40,8 @@ void xcb_xlib_lock(xcb_connection_t *c) { _xcb_lock_io(c); - assert(!c->xlib.lock); + if (!c->xlib.sloppy_lock) + assert(!c->xlib.lock); c->xlib.lock = 1; c->xlib.thread = pthread_self(); _xcb_unlock_io(c); @@ -49,7 +50,8 @@ void xcb_xlib_unlock(xcb_connection_t *c) { _xcb_lock_io(c); - assert(c->xlib.lock); + if (!c->xlib.sloppy_lock) + assert(c->xlib.lock); assert(pthread_equal(c->xlib.thread, pthread_self())); c->xlib.lock = 0; pthread_cond_broadcast(&c->xlib.cond);