summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/asan/asan_internal.h6
-rw-r--r--compiler-rt/lib/asan/asan_posix.cc25
-rw-r--r--compiler-rt/lib/asan/asan_thread_registry.cc23
-rw-r--r--compiler-rt/lib/asan/asan_thread_registry.h7
4 files changed, 37 insertions, 24 deletions
diff --git a/compiler-rt/lib/asan/asan_internal.h b/compiler-rt/lib/asan/asan_internal.h
index e6027b75f95..224cc20360e 100644
--- a/compiler-rt/lib/asan/asan_internal.h
+++ b/compiler-rt/lib/asan/asan_internal.h
@@ -108,6 +108,12 @@ int AsanClose(int fd);
bool AsanInterceptsSignal(int signum);
void InstallSignalHandlers();
int GetPid();
+uintptr_t GetThreadSelf();
+
+// Wrapper for TLS/TSD.
+void AsanTSDInit();
+void *AsanTSDGet();
+void AsanTSDSet(void *tsd);
// Opens the file 'file_name" and reads up to 'max_len' bytes.
// The resulting buffer is mmaped and stored in '*buff'.
diff --git a/compiler-rt/lib/asan/asan_posix.cc b/compiler-rt/lib/asan/asan_posix.cc
index a6d0eda7912..2bc9e485309 100644
--- a/compiler-rt/lib/asan/asan_posix.cc
+++ b/compiler-rt/lib/asan/asan_posix.cc
@@ -18,6 +18,7 @@
#include "asan_stack.h"
#include "asan_thread_registry.h"
+#include <pthread.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/resource.h>
@@ -72,6 +73,30 @@ int GetPid() {
return getpid();
}
+uintptr_t GetThreadSelf() {
+ return (uintptr_t)pthread_self();
+}
+
+// ---------------------- TSD ---------------- {{{1
+
+static pthread_key_t tsd_key;
+static bool tsd_key_inited = false;
+void AsanTSDInit() {
+ CHECK(!tsd_key_inited);
+ tsd_key_inited = true;
+ CHECK(0 == pthread_key_create(&tsd_key, 0));
+}
+
+void *AsanTSDGet() {
+ CHECK(tsd_key_inited);
+ return pthread_getspecific(tsd_key);
+}
+
+void AsanTSDSet(void *tsd) {
+ CHECK(tsd_key_inited);
+ pthread_setspecific(tsd_key, tsd);
+}
+
} // namespace __asan
#endif // __linux__ || __APPLE_
diff --git a/compiler-rt/lib/asan/asan_thread_registry.cc b/compiler-rt/lib/asan/asan_thread_registry.cc
index b341a439e71..41119b80838 100644
--- a/compiler-rt/lib/asan/asan_thread_registry.cc
+++ b/compiler-rt/lib/asan/asan_thread_registry.cc
@@ -17,9 +17,6 @@
#include "asan_thread.h"
#include "asan_thread_registry.h"
-#include <limits.h>
-#include <pthread.h>
-
namespace __asan {
static AsanThreadRegistry asan_thread_registry(__asan::LINKER_INITIALIZED);
@@ -35,8 +32,7 @@ AsanThreadRegistry::AsanThreadRegistry(LinkerInitialized x)
mu_(x) { }
void AsanThreadRegistry::Init() {
- CHECK(0 == pthread_key_create(&tls_key_, 0));
- tls_key_created_ = true;
+ AsanTSDInit();
main_thread_.set_summary(&main_thread_summary_);
main_thread_summary_.set_thread(&main_thread_);
SetCurrent(&main_thread_);
@@ -70,9 +66,7 @@ AsanThread *AsanThreadRegistry::GetMain() {
}
AsanThread *AsanThreadRegistry::GetCurrent() {
- CHECK(tls_key_created_);
- AsanThreadSummary *summary =
- (AsanThreadSummary *)pthread_getspecific(tls_key_);
+ AsanThreadSummary *summary = (AsanThreadSummary *)AsanTSDGet();
if (!summary) return 0;
return summary->thread();
}
@@ -80,17 +74,12 @@ AsanThread *AsanThreadRegistry::GetCurrent() {
void AsanThreadRegistry::SetCurrent(AsanThread *t) {
CHECK(t->summary());
if (FLAG_v >= 2) {
- Report("SetCurrent: %p for thread %p\n", t->summary(), pthread_self());
+ Report("SetCurrent: %p for thread %p\n", t->summary(), GetThreadSelf());
}
// Make sure we do not reset the current AsanThread.
- intptr_t old_key = (intptr_t)pthread_getspecific(tls_key_);
- CHECK(!old_key);
- CHECK(0 == pthread_setspecific(tls_key_, t->summary()));
- CHECK(pthread_getspecific(tls_key_) == t->summary());
-}
-
-pthread_key_t AsanThreadRegistry::GetTlsKey() {
- return tls_key_;
+ CHECK(AsanTSDGet() == 0);
+ AsanTSDSet(t->summary());
+ CHECK(AsanTSDGet() == t->summary());
}
AsanStats &AsanThreadRegistry::GetCurrentThreadStats() {
diff --git a/compiler-rt/lib/asan/asan_thread_registry.h b/compiler-rt/lib/asan/asan_thread_registry.h
index 0e8e924e3a4..994de98d60f 100644
--- a/compiler-rt/lib/asan/asan_thread_registry.h
+++ b/compiler-rt/lib/asan/asan_thread_registry.h
@@ -38,7 +38,6 @@ class AsanThreadRegistry {
// Get the current thread. May return NULL.
AsanThread *GetCurrent();
void SetCurrent(AsanThread *t);
- pthread_key_t GetTlsKey();
int GetCurrentTidOrMinusOne() {
AsanThread *t = GetCurrent();
@@ -71,12 +70,6 @@ class AsanThreadRegistry {
AsanStats accumulated_stats_;
int n_threads_;
AsanLock mu_;
- // For each thread tls_key_ stores the pointer to the corresponding
- // AsanThread.
- pthread_key_t tls_key_;
- // This flag is updated only once at program startup, and then read
- // by concurrent threads.
- bool tls_key_created_;
};
// Returns a single instance of registry.
OpenPOWER on IntegriCloud