summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'x11-libs')
-rw-r--r--x11-libs/cairo/ChangeLog6
-rw-r--r--x11-libs/cairo/cairo-1.4.8.ebuild3
-rw-r--r--x11-libs/cairo/files/cairo-1.4.8-XError.patch75
3 files changed, 82 insertions, 2 deletions
diff --git a/x11-libs/cairo/ChangeLog b/x11-libs/cairo/ChangeLog
index 81d7d51d330d..70ecb33c35c0 100644
--- a/x11-libs/cairo/ChangeLog
+++ b/x11-libs/cairo/ChangeLog
@@ -1,6 +1,10 @@
# ChangeLog for x11-libs/cairo
# Copyright 2000-2007 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/ChangeLog,v 1.132 2007/06/15 20:46:48 dertobi123 Exp $
+# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/ChangeLog,v 1.133 2007/06/15 21:55:05 cardoe Exp $
+
+ 15 Jun 2007; Doug Goldstein <cardoe@gentoo.org>
+ +files/cairo-1.4.8-XError.patch, cairo-1.4.8.ebuild:
+ upstream fix for bug #182058 and bug #182127
15 Jun 2007; Tobias Scherbaum <dertobi123@gentoo.org> cairo-1.4.6.ebuild:
ppc stable, bug #176367
diff --git a/x11-libs/cairo/cairo-1.4.8.ebuild b/x11-libs/cairo/cairo-1.4.8.ebuild
index 423b06862412..c72850998970 100644
--- a/x11-libs/cairo/cairo-1.4.8.ebuild
+++ b/x11-libs/cairo/cairo-1.4.8.ebuild
@@ -1,6 +1,6 @@
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/cairo-1.4.8.ebuild,v 1.3 2007/06/15 19:00:22 cardoe Exp $
+# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/cairo-1.4.8.ebuild,v 1.4 2007/06/15 21:55:05 cardoe Exp $
inherit eutils flag-o-matic libtool
@@ -45,6 +45,7 @@ src_unpack() {
cd "${S}"
epatch "${FILESDIR}"/${P}-directfb.patch
+ epatch "${FILESDIR}"/${P}-XError.patch
# We need to run elibtoolize to ensure correct so versioning on FreeBSD
elibtoolize
diff --git a/x11-libs/cairo/files/cairo-1.4.8-XError.patch b/x11-libs/cairo/files/cairo-1.4.8-XError.patch
new file mode 100644
index 000000000000..6021ca25a48d
--- /dev/null
+++ b/x11-libs/cairo/files/cairo-1.4.8-XError.patch
@@ -0,0 +1,75 @@
+From a51b7f58173d47b650d77b46c95f4afca138206f Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Fri, 15 Jun 2007 20:38:01 +0100
+Subject: [PATCH] [cairo-xlib-display] Hide XErrors during processing of the work queue.
+
+It is possible for the resource that we defer freeing are already
+destroyed and trigger an XError whilst processing the work queue. For
+example, the application renders to a Window and then destroys the
+Drawable before proceeding with more rendering. This will trigger an
+invalid Picture from RenderFreePicture whilst attempting to free the
+resources.
+
+By ignoring the possibility that the application could allocate a fresh
+resource with the same ID, we can simply hide the XErrors...
+---
+ src/cairo-xlib-display.c | 17 ++++++++++++++---
+ 1 files changed, 14 insertions(+), 3 deletions(-)
+
+diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c
+index 5de9011..3ff633e 100644
+--- a/src/cairo-xlib-display.c
++++ b/src/cairo-xlib-display.c
+@@ -405,10 +405,13 @@ void
+ _cairo_xlib_display_notify (cairo_xlib_display_t *display)
+ {
+ cairo_xlib_job_t *jobs, *job, *freelist;
++ Display *dpy = display->display;
+
+ CAIRO_MUTEX_LOCK (display->mutex);
+ jobs = display->workqueue;
+ while (jobs != NULL) {
++ cairo_xlib_error_func_t old_handler;
++
+ display->workqueue = NULL;
+ CAIRO_MUTEX_UNLOCK (display->mutex);
+
+@@ -422,24 +425,32 @@ _cairo_xlib_display_notify (cairo_xlib_display_t *display)
+ } while (jobs != NULL);
+ freelist = jobs = job;
+
++ /* protect the notifies from triggering XErrors
++ * XXX There is a remote possibility that the application has
++ * been reallocated an XID that we are about to destroy here... */
++ XSync (dpy, False);
++ old_handler = XSetErrorHandler (_noop_error_handler);
++
+ do {
+ job = jobs;
+ jobs = job->next;
+
+ switch (job->type){
+ case WORK:
+- job->func.work.notify (display->display, job->func.work.data);
++ job->func.work.notify (dpy, job->func.work.data);
+ if (job->func.work.destroy != NULL)
+ job->func.work.destroy (job->func.work.data);
+ break;
+
+ case RESOURCE:
+- job->func.resource.notify (display->display,
+- job->func.resource.xid);
++ job->func.resource.notify (dpy, job->func.resource.xid);
+ break;
+ }
+ } while (jobs != NULL);
+
++ XSync (dpy, False);
++ XSetErrorHandler (old_handler);
++
+ CAIRO_MUTEX_LOCK (display->mutex);
+ do {
+ job = freelist;
+--
+1.4.4.2
+