diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_stack_store.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_stack_store.cpp index 20826cc319b7..4791a3a35bdb 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_stack_store.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_stack_store.cpp @@ -108,6 +108,14 @@ uptr StackStore::Pack(Compression type) { return res; } +void StackStore::LockAll() { + for (BlockInfo &b : blocks_) b.Lock(); +} + +void StackStore::UnlockAll() { + for (BlockInfo &b : blocks_) b.Unlock(); +} + void StackStore::TestOnlyUnmap() { for (BlockInfo &b : blocks_) b.TestOnlyUnmap(this); internal_memset(this, 0, sizeof(*this)); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_stack_store.h b/compiler-rt/lib/sanitizer_common/sanitizer_stack_store.h index 14b1f43d3cc8..1bfad811f712 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_stack_store.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_stack_store.h @@ -46,6 +46,9 @@ class StackStore { // Returns the number of released bytes. uptr Pack(Compression type); + void LockAll(); + void UnlockAll(); + void TestOnlyUnmap(); private: @@ -106,6 +109,8 @@ class StackStore { void TestOnlyUnmap(StackStore *store); bool Stored(uptr n); bool IsPacked() const; + void Lock() NO_THREAD_SAFETY_ANALYSIS { mtx_.Lock(); } + void Unlock() NO_THREAD_SAFETY_ANALYSIS { mtx_.Unlock(); } }; BlockInfo blocks_[kBlockCount] = {}; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.cpp index af107b3980a5..1d3ac5cc778a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.cpp @@ -113,9 +113,11 @@ StackTrace StackDepotGet(u32 id) { void StackDepotLockAll() { theDepot.LockAll(); + stackStore.LockAll(); } void StackDepotUnlockAll() { + stackStore.UnlockAll(); theDepot.UnlockAll(); }