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 11namespace 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 23class 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