xref: /aosp_15_r20/external/leveldb/util/mutexlock.h (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors.
4*9507f98cSAndroid Build Coastguard Worker 
5*9507f98cSAndroid Build Coastguard Worker #ifndef STORAGE_LEVELDB_UTIL_MUTEXLOCK_H_
6*9507f98cSAndroid Build Coastguard Worker #define STORAGE_LEVELDB_UTIL_MUTEXLOCK_H_
7*9507f98cSAndroid Build Coastguard Worker 
8*9507f98cSAndroid Build Coastguard Worker #include "port/port.h"
9*9507f98cSAndroid Build Coastguard Worker #include "port/thread_annotations.h"
10*9507f98cSAndroid Build Coastguard Worker 
11*9507f98cSAndroid Build Coastguard Worker namespace leveldb {
12*9507f98cSAndroid Build Coastguard Worker 
13*9507f98cSAndroid Build Coastguard Worker // Helper class that locks a mutex on construction and unlocks the mutex when
14*9507f98cSAndroid Build Coastguard Worker // the destructor of the MutexLock object is invoked.
15*9507f98cSAndroid Build Coastguard Worker //
16*9507f98cSAndroid Build Coastguard Worker // Typical usage:
17*9507f98cSAndroid Build Coastguard Worker //
18*9507f98cSAndroid Build Coastguard Worker //   void MyClass::MyMethod() {
19*9507f98cSAndroid Build Coastguard Worker //     MutexLock l(&mu_);       // mu_ is an instance variable
20*9507f98cSAndroid Build Coastguard Worker //     ... some complex code, possibly with multiple return paths ...
21*9507f98cSAndroid Build Coastguard Worker //   }
22*9507f98cSAndroid Build Coastguard Worker 
23*9507f98cSAndroid Build Coastguard Worker class SCOPED_LOCKABLE MutexLock {
24*9507f98cSAndroid Build Coastguard Worker  public:
MutexLock(port::Mutex * mu)25*9507f98cSAndroid Build Coastguard Worker   explicit MutexLock(port::Mutex* mu) EXCLUSIVE_LOCK_FUNCTION(mu) : mu_(mu) {
26*9507f98cSAndroid Build Coastguard Worker     this->mu_->Lock();
27*9507f98cSAndroid Build Coastguard Worker   }
UNLOCK_FUNCTION()28*9507f98cSAndroid Build Coastguard Worker   ~MutexLock() UNLOCK_FUNCTION() { this->mu_->Unlock(); }
29*9507f98cSAndroid Build Coastguard Worker 
30*9507f98cSAndroid Build Coastguard Worker   MutexLock(const MutexLock&) = delete;
31*9507f98cSAndroid Build Coastguard Worker   MutexLock& operator=(const MutexLock&) = delete;
32*9507f98cSAndroid Build Coastguard Worker 
33*9507f98cSAndroid Build Coastguard Worker  private:
34*9507f98cSAndroid Build Coastguard Worker   port::Mutex* const mu_;
35*9507f98cSAndroid Build Coastguard Worker };
36*9507f98cSAndroid Build Coastguard Worker 
37*9507f98cSAndroid Build Coastguard Worker }  // namespace leveldb
38*9507f98cSAndroid Build Coastguard Worker 
39*9507f98cSAndroid Build Coastguard Worker #endif  // STORAGE_LEVELDB_UTIL_MUTEXLOCK_H_
40