summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamey Sharp <jamey@minilop.net>2007-10-23 11:03:33 -0700
committerJamey Sharp <jamey@minilop.net>2007-10-23 11:44:20 -0700
commit4d828c5eba9fc7161c5f18650f2dbe218e1db06f (patch)
tree5b171f1c6d59930e77fa91bb05608104d6ae9d85
parent09045eaac34973662aaa820a94ca8ed66d9dcb4e (diff)
Don't abort() on locking assertions if LIBXCB_ALLOW_SLOPPY_LOCK is set.
But do still print a full backtrace, on platforms where that's supported. This commit follows the spirit of Novell's libxcb-sloppy-lock.diff. I strongly opposed proposals like this one for a long time. Originally I had a very good reason: libX11, when compiled to use XCB, would crash soon after a locking correctness violation, so it was better to have an informative assert failure than a mystifying crash soon after. It took some time for me to realize that I'd changed the libX11 implementation (for unrelated reasons) so that it could survive most invalid locking situations, as long as it wasn't actually being used from multiple threads concurrently. The other thing that has changed is that most of the code with incorrect locking has now been fixed. The value of the assert is accordingly lower. However, remaining broken callers do need to be fixed. That's why libXCB will still noisily print a stacktrace (if possible) on each assertion failure, even when assert isn't actually invoked to abort() the program; and that's why aborting is still default. This environment variable is provided only for use as a temporary workaround for broken applications. Signed-off-by: Jamey Sharp <jamey@minilop.net> Acked-by: Josh Triplett <josh@freedesktop.org>
-rw-r--r--src/xcb_conn.c3
-rw-r--r--src/xcb_xlib.c10
-rw-r--r--src/xcbint.h1
3 files changed, 9 insertions, 5 deletions
diff --git a/src/xcb_conn.c b/src/xcb_conn.c
index 3b315bc..827a12b 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;
}
diff --git a/src/xcb_xlib.c b/src/xcb_xlib.c
index 35ad3c3..1b573e8 100644
--- a/src/xcb_xlib.c
+++ b/src/xcb_xlib.c
@@ -55,9 +55,9 @@ static void xcb_xlib_printbt(void)
}
#ifndef NDEBUG
-#define xcb_assert(x) do { if (!(x)) { xcb_xlib_printbt(); assert(x); } } while(0)
+#define xcb_assert(c,x) do { if (!(x)) { xcb_xlib_printbt(); if (!(c)->xlib.sloppy_lock) assert(x); } } while(0)
#else
-#define xcb_assert(x)
+#define xcb_assert(c,x)
#endif
unsigned int xcb_get_request_sent(xcb_connection_t *c)
@@ -70,7 +70,7 @@ unsigned int xcb_get_request_sent(xcb_connection_t *c)
void xcb_xlib_lock(xcb_connection_t *c)
{
_xcb_lock_io(c);
- xcb_assert(!c->xlib.lock);
+ xcb_assert(c, !c->xlib.lock);
c->xlib.lock = 1;
c->xlib.thread = pthread_self();
_xcb_unlock_io(c);
@@ -79,8 +79,8 @@ void xcb_xlib_lock(xcb_connection_t *c)
void xcb_xlib_unlock(xcb_connection_t *c)
{
_xcb_lock_io(c);
- xcb_assert(c->xlib.lock);
- xcb_assert(pthread_equal(c->xlib.thread, pthread_self()));
+ xcb_assert(c, c->xlib.lock);
+ xcb_assert(c, pthread_equal(c->xlib.thread, pthread_self()));
c->xlib.lock = 0;
pthread_cond_broadcast(&c->xlib.cond);
_xcb_unlock_io(c);
diff --git a/src/xcbint.h b/src/xcbint.h
index a8e167c..ab692ee 100644
--- a/src/xcbint.h
+++ b/src/xcbint.h
@@ -130,6 +130,7 @@ int _xcb_in_read_block(xcb_connection_t *c, void *buf, int nread);
typedef struct _xcb_xlib {
int lock;
+ int sloppy_lock;
pthread_t thread;
pthread_cond_t cond;
} _xcb_xlib;