Fixes for pthread thread local storage.
authorSøren Sandmann Pedersen <ssp@redhat.com>
Wed, 7 Apr 2010 05:44:12 +0000 (01:44 -0400)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Wed, 14 Apr 2010 02:41:48 +0000 (22:41 -0400)
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.

pixman/pixman-compiler.h

index cdac0d8..531c8c9 100644 (file)
     }                                                                  \
                                                                        \
     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,               \
        {                                                               \
            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