|
|
@ -0,0 +1,33 @@ |
|
|
|
--- a/src/include/threads.h
|
|
|
|
+++ b/src/include/threads.h
|
|
|
|
@@ -89,7 +89,7 @@ static _t __fr_thread_local_init_##_n(pt
|
|
|
|
# define fr_thread_local_get(_n) _n |
|
|
|
#elif defined(HAVE_PTHREAD_H) |
|
|
|
# include <pthread.h> |
|
|
|
-# define fr_thread_local_setup(_t, _n) \
|
|
|
|
+# define fr_thread_local_setup(_t, _n) static __thread _t _n;\
|
|
|
|
static pthread_key_t __fr_thread_local_key_##_n;\ |
|
|
|
static pthread_once_t __fr_thread_local_once_##_n = PTHREAD_ONCE_INIT;\ |
|
|
|
static pthread_destructor_t __fr_thread_local_destructor_##_n = NULL;\ |
|
|
|
@@ -100,17 +100,17 @@ static void __fr_thread_local_destroy_##
|
|
|
|
static void __fr_thread_local_key_init_##_n(void)\ |
|
|
|
{\ |
|
|
|
(void) pthread_key_create(&__fr_thread_local_key_##_n, __fr_thread_local_destroy_##_n);\ |
|
|
|
- (void) pthread_setspecific(__fr_thread_local_key_##_n, &(_n));\
|
|
|
|
}\ |
|
|
|
static _t __fr_thread_local_init_##_n(pthread_destructor_t func)\ |
|
|
|
{\ |
|
|
|
__fr_thread_local_destructor_##_n = func;\ |
|
|
|
if (_n) return _n; \ |
|
|
|
(void) pthread_once(&__fr_thread_local_once_##_n, __fr_thread_local_key_init_##_n);\ |
|
|
|
+ (void) pthread_setspecific(__fr_thread_local_key_##_n, &(_n));\
|
|
|
|
return _n;\ |
|
|
|
} |
|
|
|
-# define fr_thread_local_init(_n, _f) __fr_thread_local_init_##_n(_f)
|
|
|
|
-# define fr_thread_local_set(_n, _v) __fr_thread_local_set_##_n(_v)
|
|
|
|
-# define fr_thread_local_get(_n) __fr_thread_local_get_##_n()
|
|
|
|
+# define fr_thread_local_init(_n, _f) __fr_thread_local_init_##_n(_f)
|
|
|
|
+# define fr_thread_local_set(_n, _v) ((int)!((_n = _v) || 1))
|
|
|
|
+# define fr_thread_local_get(_n) _n
|
|
|
|
#endif |
|
|
|
#endif |