diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-09-10 23:57:10 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-09-10 23:57:10 +0000 |
commit | 9b0ab39b1c443744bb7b09b03e62e51d78aab527 (patch) | |
tree | 8effaaa2c5359af33e64d0e764739904a46c358f /src/pulsecore/thread.h | |
parent | 3d122d0fee2e3d853ea1a1de297b249f2c125f73 (diff) |
unify static TLS support, make use of gcc __thread attribute if available
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1797 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/pulsecore/thread.h')
-rw-r--r-- | src/pulsecore/thread.h | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/src/pulsecore/thread.h b/src/pulsecore/thread.h index 44b80a06..a0e331be 100644 --- a/src/pulsecore/thread.h +++ b/src/pulsecore/thread.h @@ -26,6 +26,12 @@ ***/ #include <pulse/def.h> +#include <pulsecore/once.h> + +/* We have to include config.h here (for the __tls stuff), which sucks */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif typedef struct pa_thread pa_thread; @@ -48,8 +54,6 @@ void pa_tls_free(pa_tls *t); void * pa_tls_get(pa_tls *t); void *pa_tls_set(pa_tls *t, void *userdata); -/* To make use of the static TLS stuff you have to include once.h, as well */ - #define PA_STATIC_TLS_DECLARE(name, free_cb) \ static struct { \ pa_once once; \ @@ -61,7 +65,7 @@ void *pa_tls_set(pa_tls *t, void *userdata); static void name##_tls_init(void) { \ name##_tls.tls = pa_tls_new(free_cb); \ } \ - static inline pa_tls* name##_tls_get(void) { \ + static inline pa_tls* name##_tls_obj(void) { \ pa_run_once(&name##_tls.once, name##_tls_init); \ return name##_tls.tls; \ } \ @@ -70,8 +74,33 @@ void *pa_tls_set(pa_tls *t, void *userdata); if (name##_tls.tls) \ pa_tls_free(name##_tls.tls); \ } \ + static inline void* name##_tls_get(void) { \ + return pa_tls_get(name##_tls_obj()); \ + } \ + static inline void* name##_tls_set(void *p) { \ + return pa_tls_set(name##_tls_obj(), p); \ + } \ struct __stupid_useless_struct_to_allow_trailing_semicolon +#ifdef HAVE_TLS_BUILTIN +/* An optimized version of the above that requires no dynamic + * allocation if the compiler supports __thread */ +#define PA_STATIC_TLS_DECLARE_NO_FREE(name) \ + static __thread void *name##_tls; \ + static inline void* name##_tls_get(void) { \ + return name##_tls; \ + } \ + static inline void* name##_tls_set(void *p) { \ + void *r = name##_tls; \ + name##_tls = p; \ + return r; \ + } \ + struct __stupid_useless_struct_to_allow_trailing_semicolon +#else +#define PA_STATIC_TLS_DECLARE_NO_FREE(name) PA_STATIC_TLS_DECLARE(name, NULL) +#endif + #define PA_STATIC_TLS_GET(name) (name##_tls_get()) +#define PA_STATIC_TLS_SET(name, p) (name##_tls_set(p)) #endif |