ART: Use bionic TLS slot for thread-self
Use a private bionic TLS slot to store self instead of using
pthreads.
Change-Id: Icc86a2b7590734637366f9d5e41a5c6d18cc5772
diff --git a/build/Android.common_build.mk b/build/Android.common_build.mk
index 05cfc42..3a1bd09 100644
--- a/build/Android.common_build.mk
+++ b/build/Android.common_build.mk
@@ -209,6 +209,11 @@
external/vixl/src \
external/zlib \
+# We optimize Thread::Current() with a direct TLS access. This requires access to a private
+# Bionic header.
+# Note: technically we only need this on device, but this avoids the duplication of the includes.
+ART_C_INCLUDES += bionic/libc/private
+
# Base set of cflags used by all things ART.
art_cflags := \
-fno-rtti \
diff --git a/runtime/thread-inl.h b/runtime/thread-inl.h
index 39ef68a..53f95a6 100644
--- a/runtime/thread-inl.h
+++ b/runtime/thread-inl.h
@@ -19,6 +19,10 @@
#include "thread.h"
+#ifdef HAVE_ANDROID_OS
+#include <bionic_tls.h> // Access to our own TLS slot.
+#endif
+
#include <pthread.h>
#include "base/casts.h"
@@ -41,7 +45,11 @@
if (!is_started_) {
return nullptr;
} else {
+#ifdef HAVE_ANDROID_OS
+ void* thread = __get_tls()[TLS_SLOT_ART_THREAD_SELF];
+#else
void* thread = pthread_getspecific(Thread::pthread_key_self_);
+#endif
return reinterpret_cast<Thread*>(thread);
}
}
diff --git a/runtime/thread.cc b/runtime/thread.cc
index 6949b0b..d5b2870 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -527,7 +527,11 @@
InitCardTable();
InitTid();
+#ifdef HAVE_ANDROID_OS
+ __get_tls()[TLS_SLOT_ART_THREAD_SELF] = this;
+#else
CHECK_PTHREAD_CALL(pthread_setspecific, (Thread::pthread_key_self_, this), "attach self");
+#endif
DCHECK_EQ(Thread::Current(), this);
tls32_.thin_lock_thread_id = thread_list->AllocThreadId(this);