diff options
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 |