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