mirror of https://github.com/facebook/rocksdb.git
AssertHeld() should do things
Summary: AssertHeld() was a no-op before. Now it does things. Also, this change caught a bad bug in SuperVersion::Init(). The method is calling db->mutex.AssertHeld(), but db variable is not initialized yet! I also fixed that issue. Test Plan: make check Reviewers: dhruba, haobo, ljin, sdong, yhchiang Reviewed By: haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D17193
This commit is contained in:
parent
ad9a39c9b4
commit
954679bb0f
|
@ -3331,10 +3331,10 @@ void DBImpl::InstallSuperVersion(DeletionState& deletion_state) {
|
|||
DBImpl::SuperVersion* DBImpl::InstallSuperVersion(
|
||||
SuperVersion* new_superversion) {
|
||||
mutex_.AssertHeld();
|
||||
new_superversion->db = this;
|
||||
new_superversion->Init(mem_, imm_.current(), versions_->current());
|
||||
SuperVersion* old_superversion = super_version_;
|
||||
super_version_ = new_superversion;
|
||||
super_version_->db = this;
|
||||
++super_version_number_;
|
||||
super_version_->version_number = super_version_number_;
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include <cstdlib>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include "util/logging.h"
|
||||
|
||||
|
@ -45,9 +46,25 @@ Mutex::Mutex(bool adaptive) {
|
|||
|
||||
Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); }
|
||||
|
||||
void Mutex::Lock() { PthreadCall("lock", pthread_mutex_lock(&mu_)); }
|
||||
void Mutex::Lock() {
|
||||
PthreadCall("lock", pthread_mutex_lock(&mu_));
|
||||
#ifndef NDEBUG
|
||||
locked_ = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
void Mutex::Unlock() { PthreadCall("unlock", pthread_mutex_unlock(&mu_)); }
|
||||
void Mutex::Unlock() {
|
||||
#ifndef NDEBUG
|
||||
locked_ = false;
|
||||
#endif
|
||||
PthreadCall("unlock", pthread_mutex_unlock(&mu_));
|
||||
}
|
||||
|
||||
void Mutex::AssertHeld() {
|
||||
#ifndef NDEBUG
|
||||
assert(locked_);
|
||||
#endif
|
||||
}
|
||||
|
||||
CondVar::CondVar(Mutex* mu)
|
||||
: mu_(mu) {
|
||||
|
@ -57,7 +74,13 @@ CondVar::CondVar(Mutex* mu)
|
|||
CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); }
|
||||
|
||||
void CondVar::Wait() {
|
||||
#ifndef NDEBUG
|
||||
mu_->locked_ = false;
|
||||
#endif
|
||||
PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_));
|
||||
#ifndef NDEBUG
|
||||
mu_->locked_ = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
void CondVar::Signal() {
|
||||
|
|
|
@ -97,11 +97,16 @@ class Mutex {
|
|||
|
||||
void Lock();
|
||||
void Unlock();
|
||||
void AssertHeld() { }
|
||||
// this will assert if the mutex is not locked
|
||||
// it does NOT verify that mutex is held by a calling thread
|
||||
void AssertHeld();
|
||||
|
||||
private:
|
||||
friend class CondVar;
|
||||
pthread_mutex_t mu_;
|
||||
#ifndef NDEBUG
|
||||
bool locked_;
|
||||
#endif
|
||||
|
||||
// No copying
|
||||
Mutex(const Mutex&);
|
||||
|
|
Loading…
Reference in New Issue