diff --git a/libc/bionic/ndk_cruft.cpp b/libc/bionic/ndk_cruft.cpp index 109c5239b..8b34495f8 100644 --- a/libc/bionic/ndk_cruft.cpp +++ b/libc/bionic/ndk_cruft.cpp @@ -346,6 +346,14 @@ extern "C" void* dlmalloc(size_t size) { return malloc(size); } +#define __get_thread __real_get_thread +#include "pthread_internal.h" +#undef __get_thread +// Various third-party apps contain a backport of our pthread_rwlock implementation that uses this. +extern "C" pthread_internal_t* __get_thread() { + return __real_get_thread(); +} + #endif // !defined(__LP64__) // This is never implemented in bionic, only needed for ABI compatibility with the NDK. diff --git a/libc/bionic/pthread_internal.h b/libc/bionic/pthread_internal.h index 8da99dd36..99882ae98 100644 --- a/libc/bionic/pthread_internal.h +++ b/libc/bionic/pthread_internal.h @@ -113,8 +113,10 @@ __LIBC_HIDDEN__ void __init_tls(pthread_internal_t* thread); __LIBC_HIDDEN__ void __init_alternate_signal_stack(pthread_internal_t*); __LIBC_HIDDEN__ void _pthread_internal_add(pthread_internal_t* thread); -/* Various third-party apps contain a backport of our pthread_rwlock implementation that uses this. */ -extern "C" __LIBC64_HIDDEN__ pthread_internal_t* __get_thread(void); +// Make __get_thread() inlined for performance reason. See http://b/19825434. +static inline __always_inline pthread_internal_t* __get_thread() { + return reinterpret_cast(__get_tls()[TLS_SLOT_THREAD_ID]); +} __LIBC_HIDDEN__ void pthread_key_clean_all(void); __LIBC_HIDDEN__ void _pthread_internal_remove_locked(pthread_internal_t* thread, bool free_thread); diff --git a/libc/bionic/pthread_internals.cpp b/libc/bionic/pthread_internals.cpp index 14061d1e6..0dd88fe80 100644 --- a/libc/bionic/pthread_internals.cpp +++ b/libc/bionic/pthread_internals.cpp @@ -68,7 +68,3 @@ void _pthread_internal_add(pthread_internal_t* thread) { } g_thread_list = thread; } - -pthread_internal_t* __get_thread(void) { - return reinterpret_cast(__get_tls()[TLS_SLOT_THREAD_ID]); -}