[cairo] BadRequest and cairo_xlib_surface_create
Tamas K Papp
tpapp at Princeton.EDU
Wed Sep 5 02:36:37 PDT 2007
On Mon, Aug 27, 2007 at 09:40:26AM -0700, Carl Worth wrote:
> On Mon, 27 Aug 2007 15:13:49 +0200, Tamas K Papp wrote:
> > Sometimes when I try to create a Cairo surface on a pixmap with
> > cairo_xlib_surface_create, I get a BadRequest error, typically of the
> > form
> >
> > X Error of failed request: BadRequest (invalid request code or no such operation)
> > Major opcode of failed request: 0 ()
>
> What that says is that the X client as sent a request with a major
> opcode of 0, (which is not any core request, nor is it any extension
> request).
>
> Cairo itself never constructs any X requests manually, (instead
> relying on Xlib or XCB to do that), so something is definitely going
> wrong at some lower level.
>
> Last week I ran into a problem that was manifesting itself the exact
> same way. It turned out that in that case what was happening was that
> during XCloseDisplay, Xlib would first clean up its state used for
> representing the Render extension, (including freeing the structure
> that stores the major opcode value for Render), and then it would call
> cairo's close_display hooks which would then call into
> XRenderFreePicture. And since Xlib had already cleaned up its Render
> state: Boom!
>
> The fix I committed for that bug was as follows:
>
> commit 9f4e6436496fe561aa124bb2b89e1c6711684d98
> Author: Carl Worth <cworth at cworth.org>
> Date: Tue Aug 21 10:03:00 2007 -0700
>
> Ensure the Render extension is initialized before calling XESetCloseDisplay
>
> This avoids a potential crash from the Render extension being cleaned
> up during XCloseDisplay before the cairo CloseDisplay hook goes on to
> call into XRenderFreePicture.
>
> This gets pretty chummy with the Xlib implementation by knowing that
> it cleans things up during XCloseDisplay in LIFO order, so as long as
> XRender is initialized before cairo registers its close_display hooks,
> then cairo's hooks get called before the XRender cleanup.
>
> Anyway, I don't know if that has anything to do with the problem
> you're having, (but you might as well try with a recent checkout of
> cairo including the above commit). And if your problem is distinct,
> maybe the above will give you an idea of the kind of thing you could
> be looking at.
>
> For me, it was a bit of xtrace, gdb, head scratching, and code
> exploration that found the problem, (and some help from Keith Packard
> to verify my conclusions and to suggest the fix).
Thanks Carl,
I think it was the same bug, downloading the latest version in git
fixes the problem and now it works like a charm (at least I hope so,
stress tests of opening/closing 100 windows in random order and doing
this many times run fine).
When should we expect a release which contains this fix? I am going
to tell cl-cairo2 users to use the latest source form git, but I also
had to compile libpixman so I guess many people would prefer to wait
for the deb package.
Tamas
More information about the cairo
mailing list