diff options
author | Francis Ricci <francisjricci@gmail.com> | 2017-02-17 03:23:07 +0000 |
---|---|---|
committer | Francis Ricci <francisjricci@gmail.com> | 2017-02-17 03:23:07 +0000 |
commit | 571c05a55059cc2783aea9ef03e57b253e3107b7 (patch) | |
tree | 95e45f3f6754d4f67f51e0c6e1a28102e3854486 | |
parent | ff266f52362856a9b1c5dd717e5795830823bf43 (diff) | |
download | bcm5719-llvm-571c05a55059cc2783aea9ef03e57b253e3107b7.tar.gz bcm5719-llvm-571c05a55059cc2783aea9ef03e57b253e3107b7.zip |
Use pthreads to store current thread id on darwin
Summary:
__thread is not supported by all darwin versions and architectures,
use pthreads instead to allow for building darwin lsan on iossim.
Reviewers: kubamracek, kcc
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D29993
llvm-svn: 295405
-rw-r--r-- | compiler-rt/lib/lsan/lsan_common.h | 2 | ||||
-rw-r--r-- | compiler-rt/lib/lsan/lsan_common_linux.cc | 4 | ||||
-rw-r--r-- | compiler-rt/lib/lsan/lsan_common_mac.cc | 33 | ||||
-rw-r--r-- | compiler-rt/lib/lsan/lsan_thread.cc | 11 |
4 files changed, 24 insertions, 26 deletions
diff --git a/compiler-rt/lib/lsan/lsan_common.h b/compiler-rt/lib/lsan/lsan_common.h index f1ec64785d6..c457d1b84a8 100644 --- a/compiler-rt/lib/lsan/lsan_common.h +++ b/compiler-rt/lib/lsan/lsan_common.h @@ -55,6 +55,8 @@ enum ChunkTag { kIgnored = 3 }; +const u32 kInvalidTid = (u32) -1; + struct Flags { #define LSAN_FLAG(Type, Name, DefaultValue, Description) Type Name; #include "lsan_flags.inc" diff --git a/compiler-rt/lib/lsan/lsan_common_linux.cc b/compiler-rt/lib/lsan/lsan_common_linux.cc index 931b5112a82..0e10d41914e 100644 --- a/compiler-rt/lib/lsan/lsan_common_linux.cc +++ b/compiler-rt/lib/lsan/lsan_common_linux.cc @@ -34,6 +34,10 @@ static bool IsLinker(const char* full_name) { return LibraryNameIs(full_name, kLinkerName); } +static THREADLOCAL u32 current_thread_tid = kInvalidTid; +u32 GetCurrentThread() { return current_thread_tid; } +void SetCurrentThread(u32 tid) { current_thread_tid = tid; } + __attribute__((tls_model("initial-exec"))) THREADLOCAL int disable_counter; bool DisabledInThisThread() { return disable_counter > 0; } diff --git a/compiler-rt/lib/lsan/lsan_common_mac.cc b/compiler-rt/lib/lsan/lsan_common_mac.cc index a58d1cd8fef..7f5e0550dc8 100644 --- a/compiler-rt/lib/lsan/lsan_common_mac.cc +++ b/compiler-rt/lib/lsan/lsan_common_mac.cc @@ -22,43 +22,46 @@ namespace __lsan { +typedef struct { + int disable_counter; + u32 current_thread_id; +} thread_local_data_t; + static pthread_key_t key; static pthread_once_t key_once = PTHREAD_ONCE_INIT; static void make_tls_key() { CHECK_EQ(pthread_key_create(&key, NULL), 0); } -static int *get_tls_val(bool allocate) { +static thread_local_data_t *get_tls_val() { pthread_once(&key_once, make_tls_key); - int *ptr = (int *)pthread_getspecific(key); - if (ptr == NULL && allocate) { - ptr = (int *)InternalAlloc(sizeof(*ptr)); - *ptr = 0; + thread_local_data_t *ptr = (thread_local_data_t *)pthread_getspecific(key); + if (ptr == NULL) { + ptr = (thread_local_data_t *)InternalAlloc(sizeof(*ptr)); + ptr->disable_counter = 0; + ptr->current_thread_id = kInvalidTid; pthread_setspecific(key, ptr); } return ptr; } -bool DisabledInThisThread() { - int *disable_counter = get_tls_val(false); - return disable_counter ? *disable_counter > 0 : false; -} - -void DisableInThisThread() { - int *disable_counter = get_tls_val(true); +bool DisabledInThisThread() { return get_tls_val()->disable_counter > 0; } - ++*disable_counter; -} +void DisableInThisThread() { ++get_tls_val()->disable_counter; } void EnableInThisThread() { - int *disable_counter = get_tls_val(true); + int *disable_counter = &get_tls_val()->disable_counter; if (*disable_counter == 0) { DisableCounterUnderflow(); } --*disable_counter; } +u32 GetCurrentThread() { return get_tls_val()->current_thread_id; } + +void SetCurrentThread(u32 tid) { get_tls_val()->current_thread_id = tid; } + void InitializePlatformSpecificModules() { CHECK(0 && "unimplemented"); } diff --git a/compiler-rt/lib/lsan/lsan_thread.cc b/compiler-rt/lib/lsan/lsan_thread.cc index f82a04aeeaf..731c97fe2bc 100644 --- a/compiler-rt/lib/lsan/lsan_thread.cc +++ b/compiler-rt/lib/lsan/lsan_thread.cc @@ -22,10 +22,7 @@ namespace __lsan { -const u32 kInvalidTid = (u32) -1; - static ThreadRegistry *thread_registry; -static THREADLOCAL u32 current_thread_tid = kInvalidTid; static ThreadContextBase *CreateThreadContext(u32 tid) { void *mem = MmapOrDie(sizeof(ThreadContext), "ThreadContext"); @@ -41,14 +38,6 @@ void InitializeThreadRegistry() { ThreadRegistry(CreateThreadContext, kMaxThreads, kThreadQuarantineSize); } -u32 GetCurrentThread() { - return current_thread_tid; -} - -void SetCurrentThread(u32 tid) { - current_thread_tid = tid; -} - ThreadContext::ThreadContext(int tid) : ThreadContextBase(tid), stack_begin_(0), |