From c41a7012ca79ad9bcf6f4c7b422caac82c99fb98 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 19 Dec 2022 13:27:33 +0900 Subject: Use pthread API if the target platform doesn't support TLS attribute --- thread_pthread.h | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/thread_pthread.h b/thread_pthread.h index ebca71b5cd..0f8e4d6096 100644 --- a/thread_pthread.h +++ b/thread_pthread.h @@ -90,13 +90,25 @@ struct rb_thread_sched { int wait_yield; }; -#if __STDC_VERSION__ >= 201112 - #define RB_THREAD_LOCAL_SPECIFIER _Thread_local -#elif defined(__GNUC__) && !defined(RB_THREAD_LOCAL_SPECIFIER_IS_UNSUPPORTED) +#ifndef RB_THREAD_LOCAL_SPECIFIER_IS_UNSUPPORTED +# if __STDC_VERSION__ >= 201112 +# define RB_THREAD_LOCAL_SPECIFIER _Thread_local +# elif defined(__GNUC__) /* note that ICC (linux) and Clang are covered by __GNUC__ */ - #define RB_THREAD_LOCAL_SPECIFIER __thread -#else +# define RB_THREAD_LOCAL_SPECIFIER __thread +# endif +#endif +RUBY_SYMBOL_EXPORT_BEGIN +#ifdef RB_THREAD_LOCAL_SPECIFIER +# ifdef __APPLE__ +// on Darwin, TLS can not be accessed across .so +struct rb_execution_context_struct *rb_current_ec(void); +void rb_current_ec_set(struct rb_execution_context_struct *); +# else +RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec; +# endif +#else typedef pthread_key_t native_tls_key_t; static inline void * @@ -113,19 +125,8 @@ native_tls_set(native_tls_key_t key, void *ptr) rb_bug("pthread_setspecific error"); } } -#endif -RUBY_SYMBOL_EXPORT_BEGIN -#ifdef RB_THREAD_LOCAL_SPECIFIER - #ifdef __APPLE__ - // on Darwin, TLS can not be accessed across .so - struct rb_execution_context_struct *rb_current_ec(void); - void rb_current_ec_set(struct rb_execution_context_struct *); - #else - RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec; - #endif -#else - RUBY_EXTERN native_tls_key_t ruby_current_ec_key; +RUBY_EXTERN native_tls_key_t ruby_current_ec_key; #endif RUBY_SYMBOL_EXPORT_END -- cgit v1.2.3