// Copyright (c) 2013, Facebook, Inc. All rights reserved.
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree. An additional grant
// of patent rights can be found in the PATENTS file in the same directory.
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include "port/port.h"
namespace
rocksdb {
// Helper class that locks a mutex on construction and unlocks the mutex when
// the destructor of the MutexLock object is invoked.
//
// Typical usage:
//
// void MyClass::MyMethod() {
// MutexLock l(&mu_); // mu_ is an instance variable
// ... some complex code, possibly with multiple return paths ...
// }
class
MutexLock {
public
:
explicit
MutexLock(port::Mutex *mu) : mu_(mu) {
this
->mu_->Lock();
}
~MutexLock() {
this
->mu_->Unlock(); }
private
:
port::Mutex *
const
mu_;
// No copying allowed
MutexLock(
const
MutexLock&);
void
operator=(
const
MutexLock&);
};
//
// Acquire a ReadLock on the specified RWMutex.
// The Lock will be automatically released then the
// object goes out of scope.
//
class
ReadLock {
public
:
explicit
ReadLock(port::RWMutex *mu) : mu_(mu) {
this
->mu_->ReadLock();
}
~ReadLock() {
this
->mu_->Unlock(); }
private
:
port::RWMutex *
const
mu_;
// No copying allowed
ReadLock(
const
ReadLock&);
void
operator=(
const
ReadLock&);
};
//
// Acquire a WriteLock on the specified RWMutex.
// The Lock will be automatically released then the
// object goes out of scope.
//
class
WriteLock {
public
:
explicit
WriteLock(port::RWMutex *mu) : mu_(mu) {
this
->mu_->WriteLock();
}
~WriteLock() {
this
->mu_->Unlock(); }
private
:
port::RWMutex *
const
mu_;
// No copying allowed
WriteLock(
const
WriteLock&);
void
operator=(
const
WriteLock&);
};
}
// namespace rocksdb