diff --git a/src/butil/thread_local.h b/src/butil/thread_local.h index 74f9533b9e..a3cb1ff087 100644 --- a/src/butil/thread_local.h +++ b/src/butil/thread_local.h @@ -31,7 +31,7 @@ #endif // _MSC_VER #define BAIDU_VOLATILE_THREAD_LOCAL(type, var_name, default_value) \ - BAIDU_THREAD_LOCAL type var_name = default_value; \ + BAIDU_THREAD_LOCAL type var_name = default_value; \ static __attribute__((noinline, unused)) type get_##var_name(void) { \ asm volatile(""); \ return var_name; \ @@ -46,10 +46,10 @@ var_name = v; \ } -#if defined(__clang__) -// Clang compiler is incorrectly caching the address of thread_local variables -// across a suspend-point. The following macros used to disable the volatile -// thread local access optimization. +#if (defined (__aarch64__) && defined (__GNUC__)) || defined(__clang__) +// GNU compiler under aarch and Clang compiler is incorrectly caching the +// address of thread_local variables across a suspend-point. The following +// macros used to disable the volatile thread local access optimization. #define BAIDU_GET_VOLATILE_THREAD_LOCAL(var_name) get_##var_name() #define BAIDU_GET_PTR_VOLATILE_THREAD_LOCAL(var_name) get_ptr_##var_name() #define BAIDU_SET_VOLATILE_THREAD_LOCAL(var_name, value) set_##var_name(value)