X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=runtime%2Ftls.h;fp=runtime%2Ftls.h;h=def2becfd51ce352c5aa1449a652c225973b3281;hb=efd90a1b8a9d3bbb1bdd8e6ae41b3462e7193fb2;hp=0000000000000000000000000000000000000000;hpb=69f813b01bb0472f9ec5368b26a702bcc06f7e29;p=nbds diff --git a/runtime/tls.h b/runtime/tls.h new file mode 100644 index 0000000..def2bec --- /dev/null +++ b/runtime/tls.h @@ -0,0 +1,34 @@ +/* + * Written by Josh Dybnis and released to the public domain, as explained at + * http://creativecommons.org/licenses/publicdomain + * + * A platform independant wrapper around thread-local storage. On platforms that don't support + * __thread variables (e.g. Mac OS X), we have to use the pthreads library for thread-local storage + */ +#ifndef TLS_H +#define TLS_H + +#ifdef __ELF__ // use gcc thread-local storage (i.e. __thread variables) +#define DECLARE_THREAD_LOCAL (name, type) type name +#define INIT_THREAD_LOCAL (name, value) name = value +#define SET_THREAD_LOCAL (name, value) name = value +#define LOCALIZE_THREAD_LOCAL(name, type) extern __thread type name + +#else//!__ELF__ + +#include + +#define DECLARE_THREAD_LOCAL(name, type) pthread_key_t name##_KEY + +#define INIT_THREAD_LOCAL(name, value) \ + do { \ + if (pthread_key_create(&name##_KEY, (void *)(size_t)value) != 0) { assert(FALSE); } \ + } while (0) + +#define SET_THREAD_LOCAL(name, value) pthread_setspecific(name##_KEY, (void *)(size_t)value); + +#define LOCALIZE_THREAD_LOCAL(name, type) \ + extern pthread_key_t name##_KEY; type name = (type)(size_t)pthread_getspecific(name##_KEY) + +#endif//__ELF__ +#endif//TLS_H