summaryrefslogtreecommitdiff
path: root/lib/scudo/scudo_tsd_shared.cpp
diff options
context:
space:
mode:
authorKostya Kortchinsky <kostyak@google.com>2017-10-13 20:55:31 +0000
committerKostya Kortchinsky <kostyak@google.com>2017-10-13 20:55:31 +0000
commite972b4cb282b92b0c15356660c4a95593066ef8c (patch)
tree8b947d7341e5ac451b910e8fc0e2514351059879 /lib/scudo/scudo_tsd_shared.cpp
parentcb11821c26e019476a12f31757083c2cde4f3262 (diff)
[scudo] Allow for non-Android Shared TSD platforms, part 2
Summary: Follow up to D38826. We introduce `pthread_{get,set}specific` versions of `{get,set}CurrentTSD` to allow for non Android platforms to use the Shared TSD model. We now allow `SCUDO_TSD_EXCLUSIVE` to be defined at compile time. A couple of things: - I know that `#if SANITIZER_ANDROID` is not ideal within a function, but in the end I feel it looks more compact and clean than going the .inc route; I am open to an alternative if anyone has one; - `SCUDO_TSD_EXCLUSIVE=1` requires ELF TLS support (and not emutls as this uses malloc). I haven't found anything to enforce that, so it's currently not checked. Reviewers: alekseyshl Reviewed By: alekseyshl Subscribers: srhines, llvm-commits Differential Revision: https://reviews.llvm.org/D38854 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@315751 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/scudo/scudo_tsd_shared.cpp')
-rw-r--r--lib/scudo/scudo_tsd_shared.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/scudo/scudo_tsd_shared.cpp b/lib/scudo/scudo_tsd_shared.cpp
index 54aec842a..6ee2f84a0 100644
--- a/lib/scudo/scudo_tsd_shared.cpp
+++ b/lib/scudo/scudo_tsd_shared.cpp
@@ -18,7 +18,7 @@
namespace __scudo {
static pthread_once_t GlobalInitialized = PTHREAD_ONCE_INIT;
-static pthread_key_t PThreadKey;
+pthread_key_t PThreadKey;
static atomic_uint32_t CurrentIndex;
static ScudoTSD *TSDs;
@@ -32,10 +32,6 @@ static uptr getNumberOfCPUs() {
}
static void initOnce() {
- // Hack: TLS_SLOT_TSAN was introduced in N. To be able to use it on M for
- // testing, we create an unused key. Since the key_data array follows the tls
- // array, it basically gives us the extra entry we need.
- // TODO(kostyak): remove and restrict to N and above.
CHECK_EQ(pthread_key_create(&PThreadKey, NULL), 0);
initScudo();
NumberOfTSDs = getNumberOfCPUs();
@@ -50,7 +46,11 @@ static void initOnce() {
}
ALWAYS_INLINE void setCurrentTSD(ScudoTSD *TSD) {
+#if SANITIZER_ANDROID
*get_android_tls_ptr() = reinterpret_cast<uptr>(TSD);
+#else
+ CHECK_EQ(pthread_setspecific(PThreadKey, reinterpret_cast<void *>(TSD)), 0);
+#endif // SANITIZER_ANDROID
}
void initThread(bool MinimalInit) {