[cairo-commit] src/cairo-xcb-screen.c
Uli Schlachter
psychon at kemper.freedesktop.org
Thu Feb 10 12:41:30 PST 2011
src/cairo-xcb-screen.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
New commits:
commit 050a877a9e6a0066200783f1e200eaaf6792e5de
Author: Uli Schlachter <psychon at znc.in>
Date: Thu Feb 10 17:33:52 2011 +0100
xcb: Fix a crash when finishing a device
The xcb backend uses caches for linear, radial and surface patterns so that it
doesn't have to create a new cairo_xcb_picture_t on every use. Whenever any
picture is finished, the surface pattern cache is checked on whether it still
contains that picture.
This means that we cannot destroy the surface_pattern_cache until after the
linear and radial_pattern_cache are destroyed or else we'll be querying the
surface pattern cache after it was finished.
This wasn't noticed before because _cairo_xcb_picture_finish couldn't acquire
the cairo_xcb_connection_t and thus failed earlier. The previous commit changed
this and now lots of tests in the test suite trigger the crash.
Signed-off-by: Uli Schlachter <psychon at znc.in>
diff --git a/src/cairo-xcb-screen.c b/src/cairo-xcb-screen.c
index 5e94d49..839e38e 100644
--- a/src/cairo-xcb-screen.c
+++ b/src/cairo-xcb-screen.c
@@ -68,9 +68,12 @@ _cairo_xcb_screen_finish (cairo_xcb_screen_t *screen)
for (i = 0; i < ARRAY_LENGTH (screen->stock_colors); i++)
cairo_surface_destroy (screen->stock_colors[i]);
- _cairo_cache_fini (&screen->surface_pattern_cache);
_cairo_cache_fini (&screen->linear_pattern_cache);
_cairo_cache_fini (&screen->radial_pattern_cache);
+ /* Do this one last, because the above two will cause picture_t
+ * to be finished. This results in a call to ..._remove_surface_picture
+ * which uses the surface pattern cache. */
+ _cairo_cache_fini (&screen->surface_pattern_cache);
_cairo_freelist_fini (&screen->pattern_cache_entry_freelist);
cairo_device_finish (screen->device);
More information about the cairo-commit
mailing list