diff options
author | Koen Kooi <koen@openembedded.org> | 2010-04-15 10:53:15 +0200 |
---|---|---|
committer | Koen Kooi <koen@openembedded.org> | 2010-04-15 10:53:15 +0200 |
commit | 67cae2cf064970365337525db76467d7dd121fdd (patch) | |
tree | 201080565f6c0f5db2fb9b21bd45d0193a2da162 /recipes/xorg-lib/pixman | |
parent | e01d04f18d0b3f38105d097098327fa2f8906154 (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.patch | 23 | ||||
-rw-r--r-- | recipes/xorg-lib/pixman/tls.patch | 59 |
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 |