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