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(
|
DBImpl::SuperVersion* DBImpl::InstallSuperVersion(
|
||||||
SuperVersion* new_superversion) {
|
SuperVersion* new_superversion) {
|
||||||
mutex_.AssertHeld();
|
mutex_.AssertHeld();
|
||||||
|
new_superversion->db = this;
|
||||||
new_superversion->Init(mem_, imm_.current(), versions_->current());
|
new_superversion->Init(mem_, imm_.current(), versions_->current());
|
||||||
SuperVersion* old_superversion = super_version_;
|
SuperVersion* old_superversion = super_version_;
|
||||||
super_version_ = new_superversion;
|
super_version_ = new_superversion;
|
||||||
super_version_->db = this;
|
|
||||||
++super_version_number_;
|
++super_version_number_;
|
||||||
super_version_->version_number = super_version_number_;
|
super_version_->version_number = super_version_number_;
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "util/logging.h"
|
#include "util/logging.h"
|
||||||
|
|
||||||
@ -45,9 +46,25 @@ Mutex::Mutex(bool adaptive) {
|
|||||||
|
|
||||||
Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); }
|
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)
|
CondVar::CondVar(Mutex* mu)
|
||||||
: mu_(mu) {
|
: mu_(mu) {
|
||||||
@ -57,7 +74,13 @@ CondVar::CondVar(Mutex* mu)
|
|||||||
CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); }
|
CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); }
|
||||||
|
|
||||||
void CondVar::Wait() {
|
void CondVar::Wait() {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
mu_->locked_ = false;
|
||||||
|
#endif
|
||||||
PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_));
|
PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_));
|
||||||
|
#ifndef NDEBUG
|
||||||
|
mu_->locked_ = true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CondVar::Signal() {
|
void CondVar::Signal() {
|
||||||
|
@ -97,11 +97,16 @@ class Mutex {
|
|||||||
|
|
||||||
void Lock();
|
void Lock();
|
||||||
void Unlock();
|
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:
|
private:
|
||||||
friend class CondVar;
|
friend class CondVar;
|
||||||
pthread_mutex_t mu_;
|
pthread_mutex_t mu_;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
bool locked_;
|
||||||
|
#endif
|
||||||
|
|
||||||
// No copying
|
// No copying
|
||||||
Mutex(const Mutex&);
|
Mutex(const Mutex&);
|
||||||
|
Loading…
Reference in New Issue
Block a user