summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2021-12-06 17:58:52 -0800
committerVitaly Buka <vitalybuka@google.com>2021-12-07 11:17:16 -0800
commit81f9dc8eee3b9319d911583a01b0060b5bce6018 (patch)
treeaeb4e761d88ad00dc90bc114cf1b4a2fd0195efc
parentbb8632c1efcec3e52fb3a9e96681a06c7db012e1 (diff)
downloadllvm-81f9dc8eee3b9319d911583a01b0060b5bce6018.tar.gz
[sanitizer] Lock/Unlock stack store on fork
Reviewed By: dvyukov Differential Revision: https://reviews.llvm.org/D115210
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_stack_store.cpp8
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_stack_store.h5
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.cpp2
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();
}