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