diff options
author | Vitaly Buka <vitalybuka@google.com> | 2021-12-06 17:58:52 -0800 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2021-12-07 11:17:16 -0800 |
commit | 81f9dc8eee3b9319d911583a01b0060b5bce6018 (patch) | |
tree | aeb4e761d88ad00dc90bc114cf1b4a2fd0195efc | |
parent | bb8632c1efcec3e52fb3a9e96681a06c7db012e1 (diff) | |
download | llvm-81f9dc8eee3b9319d911583a01b0060b5bce6018.tar.gz |
[sanitizer] Lock/Unlock stack store on fork
Reviewed By: dvyukov
Differential Revision: https://reviews.llvm.org/D115210
3 files changed, 15 insertions, 0 deletions
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(); } |