summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVenkatesh Srinivas <venkateshs@chromium.org>2021-02-17 17:50:43 -0800
committerVenkatesh Srinivas <venkateshs@chromium.org>2021-02-17 17:50:43 -0800
commitfa412adfe38ffd3f545a0e10139bd20b38b688e9 (patch)
treeea6cb0fab92cea30099b0a059af7a3e3a736de24
parentcc496aecb81ee5966c865f3723743ff02046c5ad (diff)
downloadgperftools-fa412adfe38ffd3f545a0e10139bd20b38b688e9.tar.gz
Fix thread-safety (annotalysis) annotations
tcmalloc contains some thread-safety annotations; however those annotations have not been exercised for some time, as they used macros/attributes only supported by a legacy branch of gcc. Pull request #1251 converted those macros to support modern versions of clang; this CR fixes the annotations that were enabled. For the most part, this just requires re-enabling annotations on member functions that take/release locks. For the tcmalloc fork (pre-fork and post-fork) handlers, we mark the functions as exempt from this analysis, as it takes a dynamic number of locks.
-rw-r--r--src/base/low_level_alloc.cc2
-rw-r--r--src/base/spinlock.h12
-rw-r--r--src/central_freelist.h4
-rw-r--r--src/static_vars.cc4
4 files changed, 8 insertions, 14 deletions
diff --git a/src/base/low_level_alloc.cc b/src/base/low_level_alloc.cc
index d537d9c..db91155 100644
--- a/src/base/low_level_alloc.cc
+++ b/src/base/low_level_alloc.cc
@@ -248,7 +248,7 @@ namespace {
this->arena_->mu.Lock();
}
~ArenaLock() { RAW_CHECK(this->left_, "haven't left Arena region"); }
- void Leave() /*UNLOCK_FUNCTION()*/ {
+ void Leave() UNLOCK_FUNCTION() {
this->arena_->mu.Unlock();
#if 0
if (this->mask_valid_) {
diff --git a/src/base/spinlock.h b/src/base/spinlock.h
index a481c8d..118f541 100644
--- a/src/base/spinlock.h
+++ b/src/base/spinlock.h
@@ -63,9 +63,7 @@ class LOCKABLE SpinLock {
}
// Acquire this SpinLock.
- // TODO(csilvers): uncomment the annotation when we figure out how to
- // support this macro with 0 args (see thread_annotations.h)
- inline void Lock() /*EXCLUSIVE_LOCK_FUNCTION()*/ {
+ inline void Lock() EXCLUSIVE_LOCK_FUNCTION() {
if (base::subtle::Acquire_CompareAndSwap(&lockword_, kSpinLockFree,
kSpinLockHeld) != kSpinLockFree) {
SlowLock();
@@ -84,9 +82,7 @@ class LOCKABLE SpinLock {
}
// Release this SpinLock, which must be held by the calling thread.
- // TODO(csilvers): uncomment the annotation when we figure out how to
- // support this macro with 0 args (see thread_annotations.h)
- inline void Unlock() /*UNLOCK_FUNCTION()*/ {
+ inline void Unlock() UNLOCK_FUNCTION() {
uint64 prev_value = static_cast<uint64>(
base::subtle::Release_AtomicExchange(&lockword_, kSpinLockFree));
if (prev_value != kSpinLockHeld) {
@@ -127,9 +123,7 @@ class SCOPED_LOCKABLE SpinLockHolder {
: lock_(l) {
l->Lock();
}
- // TODO(csilvers): uncomment the annotation when we figure out how to
- // support this macro with 0 args (see thread_annotations.h)
- inline ~SpinLockHolder() /*UNLOCK_FUNCTION()*/ { lock_->Unlock(); }
+ inline ~SpinLockHolder() UNLOCK_FUNCTION() { lock_->Unlock(); }
};
// Catch bug where variable name is omitted, e.g. SpinLockHolder (&lock);
#define SpinLockHolder(x) COMPILE_ASSERT(0, spin_lock_decl_missing_var_name)
diff --git a/src/central_freelist.h b/src/central_freelist.h
index 4148680..0f66e0c 100644
--- a/src/central_freelist.h
+++ b/src/central_freelist.h
@@ -82,11 +82,11 @@ class CentralFreeList {
// Lock/Unlock the internal SpinLock. Used on the pthread_atfork call
// to set the lock in a consistent state before the fork.
- void Lock() {
+ void Lock() EXCLUSIVE_LOCK_FUNCTION(lock_) {
lock_.Lock();
}
- void Unlock() {
+ void Unlock() UNLOCK_FUNCTION(lock_) {
lock_.Unlock();
}
diff --git a/src/static_vars.cc b/src/static_vars.cc
index ab5a9cc..fef6ed1 100644
--- a/src/static_vars.cc
+++ b/src/static_vars.cc
@@ -52,14 +52,14 @@ namespace tcmalloc {
// sure the central_cache locks remain in a consisten state in the forked
// version of the thread.
-void CentralCacheLockAll()
+void CentralCacheLockAll() NO_THREAD_SAFETY_ANALYSIS
{
Static::pageheap_lock()->Lock();
for (int i = 0; i < Static::num_size_classes(); ++i)
Static::central_cache()[i].Lock();
}
-void CentralCacheUnlockAll()
+void CentralCacheUnlockAll() NO_THREAD_SAFETY_ANALYSIS
{
for (int i = 0; i < Static::num_size_classes(); ++i)
Static::central_cache()[i].Unlock();