Index: lib/lsan/lsan_common_linux.cc =================================================================== --- lib/lsan/lsan_common_linux.cc +++ lib/lsan/lsan_common_linux.cc @@ -34,6 +34,10 @@ return LibraryNameIs(full_name, kLinkerName); } +static THREADLOCAL u32 current_thread_tid = 0xffffff; // 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; } Index: lib/lsan/lsan_common_mac.cc =================================================================== --- lib/lsan/lsan_common_mac.cc +++ lib/lsan/lsan_common_mac.cc @@ -22,43 +22,44 @@ namespace __lsan { +typedef struct thread_info { + int disable_counter = 0; + u32 current_thread_id = 0xffffff; // kInvalidTid from asan_thread.h +} thread_info_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_info_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_info_t *ptr = (thread_info_t *)pthread_getspecific(key); + if (ptr == NULL) { + ptr = (thread_info_t *)InternalAlloc(sizeof(*ptr)); 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"); } Index: lib/lsan/lsan_thread.cc =================================================================== --- lib/lsan/lsan_thread.cc +++ lib/lsan/lsan_thread.cc @@ -25,7 +25,6 @@ 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 +40,6 @@ 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),