[Xcb] Calling XAllocID() twice causes assertion `ret != inval_id' failed
Matthieu Herrb
matthieu.herrb at laas.fr
Sun Jul 11 02:17:37 PDT 2010
Hi,
I'm trying to help someone understanding why an application using
the old XView (from OpenWindows) toolkit is crashing with the infamous)
xcb_io.c:378: _XAllocID: Assertion `ret != inval_id' failed.
He figured out that this happens because xview sometimes calls XAllocID()
twice in a row.
Indeed the program below reproduces the problem. Looking at libX11
source code, it's obvious why this happens. Since XView is inherently
not thread-safe, there is no multi-threading involved and
XInitThreads() is never called, so dpy->lock is NULL and so _XIDHandler()
is never called by XLockDisplay(), thus the xcb->next_xid field
stays 'invalid_id'.
I think this is a bug, and could be also one cause of
https://bugs.freedesktop.org/show_bug.cgi?id=27552
Thoughts?
#include <stdio.h>
#include <X11/Xlib.h>
int main(int argc, char** args) {
Display * dpy;
XInitThreads();
dpy = XOpenDisplay(NULL);
printf("Display = %08x\n", dpy);
int i;
for (i = 0; i < 100; i++) {
XLockDisplay(dpy);
int xid = XAllocID(dpy);
printf("xid = %08x\n", xid);
XUnlockDisplay(dpy);
XFlush(dpy);
}
}
--
Matthieu Herrb
More information about the Xcb
mailing list