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 @@ -86,17 +86,22 @@ } Thread *CreateCurrentThread() { - Thread *t; + Thread *t = nullptr; { - SpinMutexLock l(&list_mutex_); + SpinMutexLock l(&free_list_mutex_); if (!free_list_.empty()) { t = free_list_.back(); free_list_.pop_back(); - uptr start = (uptr)t - ring_buffer_size_; - internal_memset((void *)start, 0, ring_buffer_size_ + sizeof(Thread)); - } else { - t = AllocThread(); } + } + 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); } t->Init((uptr)t - ring_buffer_size_, ring_buffer_size_); @@ -110,6 +115,7 @@ } void RemoveThreadFromLiveList(Thread *t) { + SpinMutexLock l(&live_list_mutex_); for (Thread *&t2 : live_list_) if (t2 == t) { // To remove t2, copy the last element of the list in t2's position, and @@ -124,10 +130,10 @@ void ReleaseThread(Thread *t) { RemoveThreadStats(t); t->Destroy(); - SpinMutexLock l(&list_mutex_); + DontNeedThread(t); RemoveThreadFromLiveList(t); + SpinMutexLock l(&free_list_mutex_); free_list_.push_back(t); - DontNeedThread(t); } Thread *GetThreadByBufferAddress(uptr p) { @@ -144,7 +150,7 @@ template void VisitAllLiveThreads(CB cb) { - SpinMutexLock l(&list_mutex_); + SpinMutexLock l(&live_list_mutex_); for (Thread *t : live_list_) cb(t); } @@ -180,9 +186,10 @@ uptr ring_buffer_size_; uptr thread_alloc_size_; + SpinMutex free_list_mutex_; InternalMmapVector free_list_; + SpinMutex live_list_mutex_; InternalMmapVector live_list_; - SpinMutex list_mutex_; ThreadStats stats_; SpinMutex stats_mutex_;