diff options
Diffstat (limited to 'pixman/pixman-compiler.h')
-rw-r--r-- | pixman/pixman-compiler.h | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/pixman/pixman-compiler.h b/pixman/pixman-compiler.h index 5aeef86..a4e3f88 100644 --- a/pixman/pixman-compiler.h +++ b/pixman/pixman-compiler.h @@ -70,11 +70,62 @@ #endif /* TLS */ -#if (defined (__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR >= 3) || __GNUC__ > 3)) || defined(__SUNPRO_C) -# define THREAD_LOCAL __thread -#elif defined (_MSC_VER) -# define THREAD_LOCAL __declspec(thread) +#if defined(TOOLCHAIN_SUPPORTS__THREAD) + +# define PIXMAN_DEFINE_THREAD_LOCAL(type, name) \ + static __thread type name +# define PIXMAN_GET_THREAD_LOCAL(name) \ + (&name) + +#elif defined(_MSC_VER) + +# define PIXMAN_DEFINE_THREAD_LOCAL(type, name) \ + static __declspec(thread) type name +# define PIXMAN_GET_THREAD_LOCAL(name) \ + (&name) + +#elif defined(HAVE_PTHREAD_SETSPECIFIC) + +#include <pthread.h> + +# define PIXMAN_DEFINE_THREAD_LOCAL(type, name) \ + static pthread_once_t tls_ ## name ## _once_control = PTHREAD_ONCE_INIT; \ + static pthread_key_t tls_ ## name ## _key; \ + \ + static void \ + tls_ ## name ## _make_key (void) \ + { \ + pthread_key_create (&tls_ ## name ## _key, NULL); \ + } \ + \ + static type * \ + tls_ ## name ## _alloc (key) \ + { \ + type *value = malloc (sizeof (type)); \ + if (value) \ + pthread_setspecific (key, value); \ + return value; \ + } \ + \ + static force_inline type * \ + tls_ ## name ## _get (key) \ + { \ + type *value = NULL; \ + if (pthread_once (&tls_ ## name ## _once_control, \ + tls_ ## name ## _make_key) == 0) \ + { \ + value = pthread_getspecific (tls_ ## name ## _key); \ + if (!value) \ + value = tls_ ## name ## _alloc (key); \ + } \ + return value; \ + } + +# define PIXMAN_GET_THREAD_LOCAL(name) \ + tls_ ## name ## _get (tls_ ## name ## _key) + #else -# warning "unknown compiler" -# define THREAD_LOCAL __thread + +# error "Unknown thread local support for this system" + #endif |