diff --git a/compiler-rt/lib/hwasan/hwasan_thread_list.h b/compiler-rt/lib/hwasan/hwasan_thread_list.h --- a/compiler-rt/lib/hwasan/hwasan_thread_list.h +++ b/compiler-rt/lib/hwasan/hwasan_thread_list.h @@ -85,25 +85,16 @@ RoundUpTo(ring_buffer_size_ + sizeof(Thread), ring_buffer_size_ * 2); } - Thread *CreateCurrentThread(const Thread::InitState *state = nullptr) { - Thread *t = nullptr; - { - SpinMutexLock l(&free_list_mutex_); - if (!free_list_.empty()) { - t = free_list_.back(); - free_list_.pop_back(); - } - } + Thread *CreateCurrentThread(const Thread::InitState *state = nullptr) + SANITIZER_EXCLUDES(free_list_mutex_, live_list_mutex_) { + Thread *t = PopThread(); if (t) { uptr start = (uptr)t - ring_buffer_size_; internal_memset((void *)start, 0, ring_buffer_size_ + sizeof(Thread)); } else { t = AllocThread(); } - { - SpinMutexLock l(&live_list_mutex_); - live_list_.push_back(t); - } + PushThread(t); t->Init((uptr)t - ring_buffer_size_, ring_buffer_size_, state); AddThreadStats(t); return t; @@ -114,7 +105,8 @@ ReleaseMemoryPagesToOS(start, start + thread_alloc_size_); } - void RemoveThreadFromLiveList(Thread *t) { + void RemoveThreadFromLiveList(Thread *t) + SANITIZER_EXCLUDES(live_list_mutex_) { SpinMutexLock l(&live_list_mutex_); for (Thread *&t2 : live_list_) if (t2 == t) { @@ -127,7 +119,7 @@ CHECK(0 && "thread not found in live list"); } - void ReleaseThread(Thread *t) { + void ReleaseThread(Thread *t) SANITIZER_EXCLUDES(free_list_mutex_) { RemoveThreadStats(t); t->Destroy(); DontNeedThread(t); @@ -149,7 +141,7 @@ } template - void VisitAllLiveThreads(CB cb) { + void VisitAllLiveThreads(CB cb) SANITIZER_EXCLUDES(live_list_mutex_) { SpinMutexLock l(&live_list_mutex_); for (Thread *t : live_list_) cb(t); } @@ -184,6 +176,21 @@ return t; } + Thread *PopThread() SANITIZER_EXCLUDES(free_list_mutex_) { + SpinMutexLock l(&free_list_mutex_); + Thread *t = nullptr; + if (!free_list_.empty()) { + t = free_list_.back(); + free_list_.pop_back(); + } + return t; + } + + void PushThread(Thread *t) SANITIZER_EXCLUDES(live_list_mutex_) { + SpinMutexLock l(&live_list_mutex_); + live_list_.push_back(t); + } + SpinMutex free_space_mutex_; uptr free_space_; uptr free_space_end_; @@ -191,9 +198,11 @@ uptr thread_alloc_size_; SpinMutex free_list_mutex_; - InternalMmapVector free_list_; + InternalMmapVector free_list_ + SANITIZER_GUARDED_BY(free_list_mutex_); SpinMutex live_list_mutex_; - InternalMmapVector live_list_; + InternalMmapVector live_list_ + SANITIZER_GUARDED_BY(live_list_mutex_); ThreadStats stats_; SpinMutex stats_mutex_;