Use pthread API if the target platform doesn't support TLS attribute

This commit is contained in:
Nobuyoshi Nakada 2022-12-19 13:27:33 +09:00
Родитель 4de514da38
Коммит c41a7012ca
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 7CD2805BFA3770C6
1 изменённых файлов: 18 добавлений и 17 удалений

Просмотреть файл

@ -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