Skip to content

Commit 6a91068

Browse files
ckennellycopybara-github
authored andcommitted
Add lifetime annotations to MutexLock, SpinLockHolder, etc.
PiperOrigin-RevId: 791269651 Change-Id: Ie3ad265f6ab6535a3240fb159ba498f5a6bb15ce
1 parent 41d463f commit 6a91068

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

absl/base/internal/spinlock.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,9 @@ class ABSL_LOCKABLE ABSL_ATTRIBUTE_WARN_UNUSED SpinLock {
238238
// the duration of a C++ scope.
239239
class ABSL_SCOPED_LOCKABLE [[nodiscard]] SpinLockHolder {
240240
public:
241-
inline explicit SpinLockHolder(SpinLock& l) ABSL_EXCLUSIVE_LOCK_FUNCTION(l)
241+
inline explicit SpinLockHolder(
242+
SpinLock& l ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
243+
ABSL_EXCLUSIVE_LOCK_FUNCTION(l)
242244
: lock_(l) {
243245
l.lock();
244246
}

absl/synchronization/mutex.h

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,9 @@ class ABSL_SCOPED_LOCKABLE MutexLock {
601601

602602
// Calls `mu.lock()` and returns when that call returns. That is, `mu` is
603603
// guaranteed to be locked when this object is constructed.
604-
explicit MutexLock(Mutex& mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) : mu_(mu) {
604+
explicit MutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
605+
ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
606+
: mu_(mu) {
605607
this->mu_.lock();
606608
}
607609

@@ -611,8 +613,8 @@ class ABSL_SCOPED_LOCKABLE MutexLock {
611613
// Like above, but calls `mu->LockWhen(cond)` instead. That is, in addition to
612614
// the above, the condition given by `cond` is also guaranteed to hold when
613615
// this object is constructed.
614-
explicit MutexLock(Mutex& mu, const Condition& cond)
615-
ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
616+
explicit MutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this),
617+
const Condition& cond) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
616618
: mu_(mu) {
617619
this->mu_.LockWhen(cond);
618620
}
@@ -638,15 +640,17 @@ class ABSL_SCOPED_LOCKABLE MutexLock {
638640
// releases a shared lock on a `Mutex` via RAII.
639641
class ABSL_SCOPED_LOCKABLE ReaderMutexLock {
640642
public:
641-
explicit ReaderMutexLock(Mutex& mu) ABSL_SHARED_LOCK_FUNCTION(mu) : mu_(mu) {
643+
explicit ReaderMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
644+
ABSL_SHARED_LOCK_FUNCTION(mu)
645+
: mu_(mu) {
642646
mu.ReaderLock();
643647
}
644648

645649
explicit ReaderMutexLock(Mutex* absl_nonnull mu) ABSL_SHARED_LOCK_FUNCTION(mu)
646650
: ReaderMutexLock(*mu) {}
647651

648-
explicit ReaderMutexLock(Mutex& mu, const Condition& cond)
649-
ABSL_SHARED_LOCK_FUNCTION(mu)
652+
explicit ReaderMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this),
653+
const Condition& cond) ABSL_SHARED_LOCK_FUNCTION(mu)
650654
: mu_(mu) {
651655
mu.ReaderLockWhen(cond);
652656
}
@@ -672,7 +676,8 @@ class ABSL_SCOPED_LOCKABLE ReaderMutexLock {
672676
// releases a write (exclusive) lock on a `Mutex` via RAII.
673677
class ABSL_SCOPED_LOCKABLE WriterMutexLock {
674678
public:
675-
explicit WriterMutexLock(Mutex& mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
679+
explicit WriterMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
680+
ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
676681
: mu_(mu) {
677682
mu.WriterLock();
678683
}
@@ -681,7 +686,8 @@ class ABSL_SCOPED_LOCKABLE WriterMutexLock {
681686
ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
682687
: WriterMutexLock(*mu) {}
683688

684-
explicit WriterMutexLock(Mutex& mu, const Condition& cond)
689+
explicit WriterMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this),
690+
const Condition& cond)
685691
ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
686692
: mu_(mu) {
687693
mu.WriterLockWhen(cond);
@@ -1084,7 +1090,8 @@ class ABSL_SCOPED_LOCKABLE MutexLockMaybe {
10841090
// mutex before destruction. `Release()` may be called at most once.
10851091
class ABSL_SCOPED_LOCKABLE ReleasableMutexLock {
10861092
public:
1087-
explicit ReleasableMutexLock(Mutex& mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
1093+
explicit ReleasableMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(
1094+
this)) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
10881095
: mu_(&mu) {
10891096
this->mu_->Lock();
10901097
}
@@ -1093,8 +1100,9 @@ class ABSL_SCOPED_LOCKABLE ReleasableMutexLock {
10931100
ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
10941101
: ReleasableMutexLock(*mu) {}
10951102

1096-
explicit ReleasableMutexLock(Mutex& mu, const Condition& cond)
1097-
ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
1103+
explicit ReleasableMutexLock(
1104+
Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this),
1105+
const Condition& cond) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
10981106
: mu_(&mu) {
10991107
this->mu_->LockWhen(cond);
11001108
}

0 commit comments

Comments
 (0)