summaryrefslogtreecommitdiff
path: root/recipes/xorg-lib/pixman
diff options
context:
space:
mode:
authorKoen Kooi <koen@openembedded.org>2010-04-15 10:53:15 +0200
committerKoen Kooi <koen@openembedded.org>2010-04-15 10:53:15 +0200
commit67cae2cf064970365337525db76467d7dd121fdd (patch)
tree201080565f6c0f5db2fb9b21bd45d0193a2da162 /recipes/xorg-lib/pixman
parente01d04f18d0b3f38105d097098327fa2f8906154 (diff)
pixman git + 0.18.0: add patches to fix TLS behaviour
Diffstat (limited to 'recipes/xorg-lib/pixman')
-rw-r--r--recipes/xorg-lib/pixman/calloc.patch23
-rw-r--r--recipes/xorg-lib/pixman/tls.patch59
2 files changed, 82 insertions, 0 deletions
diff --git a/recipes/xorg-lib/pixman/calloc.patch b/recipes/xorg-lib/pixman/calloc.patch
new file mode 100644
index 0000000000..4a60d7ef9a
--- /dev/null
+++ b/recipes/xorg-lib/pixman/calloc.patch
@@ -0,0 +1,23 @@
+From 634ba33b5b1fcfd5a0e7910f9991b4ed4f674549 Mon Sep 17 00:00:00 2001
+From: Søren Sandmann Pedersen <ssp@redhat.com>
+Date: Wed, 07 Apr 2010 05:39:14 +0000
+Subject: Fix uninitialized cache when pthreads are used
+
+The thread local cache is allocated with malloc(), but we rely on it
+being initialized to zero, so allocate it with calloc() instead.
+---
+diff --git a/pixman/pixman-compiler.h b/pixman/pixman-compiler.h
+index a4e3f88..cdac0d8 100644
+--- a/pixman/pixman-compiler.h
++++ b/pixman/pixman-compiler.h
+@@ -101,7 +101,7 @@
+ static type * \
+ tls_ ## name ## _alloc (key) \
+ { \
+- type *value = malloc (sizeof (type)); \
++ type *value = calloc (1, sizeof (type)); \
+ if (value) \
+ pthread_setspecific (key, value); \
+ return value; \
+--
+cgit v0.8.3-6-g21f6
diff --git a/recipes/xorg-lib/pixman/tls.patch b/recipes/xorg-lib/pixman/tls.patch
new file mode 100644
index 0000000000..316caed65f
--- /dev/null
+++ b/recipes/xorg-lib/pixman/tls.patch
@@ -0,0 +1,59 @@
+From 714559dccda3165a72f0a9935c1edc3aef535f30 Mon Sep 17 00:00:00 2001
+From: Søren Sandmann Pedersen <ssp@redhat.com>
+Date: Wed, 07 Apr 2010 05:44:12 +0000
+Subject: Fixes for pthread thread local storage.
+
+The tls_name_key variable is passed to tls_name_get(), and the first
+time this happens it isn't initialized. tls_name_get() then passes it
+on to tls_name_alloc() which passes it on to pthread_setspecific()
+leading to undefined behavior.
+
+None of this is actually necessary at all because there is only one
+such variable per thread local variable, so it doesn't need to passed
+as a parameter at all.
+
+All of this was pointed out by Tor Lillqvist on the cairo mailing
+list.
+---
+diff --git a/pixman/pixman-compiler.h b/pixman/pixman-compiler.h
+index cdac0d8..531c8c9 100644
+--- a/pixman/pixman-compiler.h
++++ b/pixman/pixman-compiler.h
+@@ -99,16 +99,16 @@
+ } \
+ \
+ static type * \
+- tls_ ## name ## _alloc (key) \
++ tls_ ## name ## _alloc (void) \
+ { \
+ type *value = calloc (1, sizeof (type)); \
+ if (value) \
+- pthread_setspecific (key, value); \
++ pthread_setspecific (tls_ ## name ## _key, value); \
+ return value; \
+ } \
+ \
+ static force_inline type * \
+- tls_ ## name ## _get (key) \
++ tls_ ## name ## _get (void) \
+ { \
+ type *value = NULL; \
+ if (pthread_once (&tls_ ## name ## _once_control, \
+@@ -116,13 +116,13 @@
+ { \
+ value = pthread_getspecific (tls_ ## name ## _key); \
+ if (!value) \
+- value = tls_ ## name ## _alloc (key); \
++ value = tls_ ## name ## _alloc (); \
+ } \
+ return value; \
+ }
+
+ # define PIXMAN_GET_THREAD_LOCAL(name) \
+- tls_ ## name ## _get (tls_ ## name ## _key)
++ tls_ ## name ## _get ()
+
+ #else
+
+--
+cgit v0.8.3-6-g21f6