pipeline: use constant-initi static MutexImpl for global debug lock

This commit is contained in:
rdb 2019-02-11 16:01:43 +01:00
parent 3df3b27a4e
commit afed80e83a
4 changed files with 36 additions and 52 deletions

View File

@ -29,7 +29,7 @@ using std::ostringstream;
ConditionVarDebug:: ConditionVarDebug::
ConditionVarDebug(MutexDebug &mutex) : ConditionVarDebug(MutexDebug &mutex) :
_mutex(mutex), _mutex(mutex),
_impl(*mutex.get_global_lock()) _impl(mutex._global_lock)
{ {
nassertv(!_mutex._allow_recursion); nassertv(!_mutex._allow_recursion);
} }
@ -60,7 +60,7 @@ ConditionVarDebug::
*/ */
void ConditionVarDebug:: void ConditionVarDebug::
wait() { wait() {
_mutex._global_lock->lock(); _mutex._global_lock.lock();
Thread *current_thread = Thread::get_current_thread(); Thread *current_thread = Thread::get_current_thread();
@ -69,7 +69,7 @@ wait() {
ostr << *current_thread << " attempted to wait on " ostr << *current_thread << " attempted to wait on "
<< *this << " without holding " << _mutex; << *this << " without holding " << _mutex;
nassert_raise(ostr.str()); nassert_raise(ostr.str());
_mutex._global_lock->unlock(); _mutex._global_lock.unlock();
return; return;
} }
@ -95,7 +95,7 @@ wait() {
<< *current_thread << " awake on " << *this << "\n"; << *current_thread << " awake on " << *this << "\n";
} }
_mutex._global_lock->unlock(); _mutex._global_lock.unlock();
} }
/** /**
@ -108,7 +108,7 @@ wait() {
*/ */
void ConditionVarDebug:: void ConditionVarDebug::
wait(double timeout) { wait(double timeout) {
_mutex._global_lock->lock(); _mutex._global_lock.lock();
Thread *current_thread = Thread::get_current_thread(); Thread *current_thread = Thread::get_current_thread();
@ -117,7 +117,7 @@ wait(double timeout) {
ostr << *current_thread << " attempted to wait on " ostr << *current_thread << " attempted to wait on "
<< *this << " without holding " << _mutex; << *this << " without holding " << _mutex;
nassert_raise(ostr.str()); nassert_raise(ostr.str());
_mutex._global_lock->unlock(); _mutex._global_lock.unlock();
return; return;
} }
@ -144,7 +144,7 @@ wait(double timeout) {
<< *current_thread << " awake on " << *this << "\n"; << *current_thread << " awake on " << *this << "\n";
} }
_mutex._global_lock->unlock(); _mutex._global_lock.unlock();
} }
/** /**
@ -158,7 +158,7 @@ wait(double timeout) {
*/ */
void ConditionVarDebug:: void ConditionVarDebug::
notify() { notify() {
_mutex._global_lock->lock(); _mutex._global_lock.lock();
/* /*
if (!_mutex.do_debug_is_locked()) { if (!_mutex.do_debug_is_locked()) {
@ -167,7 +167,7 @@ notify() {
ostr << *current_thread << " attempted to notify " ostr << *current_thread << " attempted to notify "
<< *this << " without holding " << _mutex; << *this << " without holding " << _mutex;
nassert_raise(ostr.str()); nassert_raise(ostr.str());
_mutex._global_lock->unlock(); _mutex._global_lock.unlock();
return; return;
} }
*/ */
@ -179,7 +179,7 @@ notify() {
} }
_impl.notify(); _impl.notify();
_mutex._global_lock->unlock(); _mutex._global_lock.unlock();
} }
/** /**
@ -190,7 +190,7 @@ notify() {
*/ */
void ConditionVarDebug:: void ConditionVarDebug::
notify_all() { notify_all() {
_mutex._global_lock->lock(); _mutex._global_lock.lock();
/* /*
if (!_mutex.do_debug_is_locked()) { if (!_mutex.do_debug_is_locked()) {
@ -199,7 +199,7 @@ notify_all() {
ostr << *current_thread << " attempted to notify " ostr << *current_thread << " attempted to notify "
<< *this << " without holding " << _mutex; << *this << " without holding " << _mutex;
nassert_raise(ostr.str()); nassert_raise(ostr.str());
_mutex._global_lock->unlock(); _mutex._global_lock.unlock();
return; return;
} }
*/ */
@ -211,7 +211,7 @@ notify_all() {
} }
_impl.notify_all(); _impl.notify_all();
_mutex._global_lock->unlock(); _mutex._global_lock.unlock();
} }
/** /**

View File

@ -18,9 +18,9 @@
INLINE void MutexDebug:: INLINE void MutexDebug::
lock() { lock() {
TAU_PROFILE("void MutexDebug::acquire()", " ", TAU_USER); TAU_PROFILE("void MutexDebug::acquire()", " ", TAU_USER);
_global_lock->lock(); _global_lock.lock();
((MutexDebug *)this)->do_lock(Thread::get_current_thread()); ((MutexDebug *)this)->do_lock(Thread::get_current_thread());
_global_lock->unlock(); _global_lock.unlock();
} }
/** /**
@ -30,9 +30,9 @@ lock() {
INLINE bool MutexDebug:: INLINE bool MutexDebug::
try_lock() { try_lock() {
TAU_PROFILE("void MutexDebug::try_lock()", " ", TAU_USER); TAU_PROFILE("void MutexDebug::try_lock()", " ", TAU_USER);
_global_lock->lock(); _global_lock.lock();
bool acquired = ((MutexDebug *)this)->do_try_lock(Thread::get_current_thread()); bool acquired = ((MutexDebug *)this)->do_try_lock(Thread::get_current_thread());
_global_lock->unlock(); _global_lock.unlock();
return acquired; return acquired;
} }
@ -43,9 +43,9 @@ try_lock() {
INLINE void MutexDebug:: INLINE void MutexDebug::
unlock() { unlock() {
TAU_PROFILE("void MutexDebug::unlock()", " ", TAU_USER); TAU_PROFILE("void MutexDebug::unlock()", " ", TAU_USER);
_global_lock->lock(); _global_lock.lock();
((MutexDebug *)this)->do_unlock(); ((MutexDebug *)this)->do_unlock();
_global_lock->unlock(); _global_lock.unlock();
} }
/** /**
@ -62,9 +62,9 @@ INLINE void MutexDebug::
acquire(Thread *current_thread) const { acquire(Thread *current_thread) const {
TAU_PROFILE("void MutexDebug::acquire(Thread *)", " ", TAU_USER); TAU_PROFILE("void MutexDebug::acquire(Thread *)", " ", TAU_USER);
nassertv(current_thread == Thread::get_current_thread()); nassertv(current_thread == Thread::get_current_thread());
_global_lock->lock(); _global_lock.lock();
((MutexDebug *)this)->do_lock(current_thread); ((MutexDebug *)this)->do_lock(current_thread);
_global_lock->unlock(); _global_lock.unlock();
} }
/** /**
@ -75,9 +75,9 @@ INLINE bool MutexDebug::
try_acquire(Thread *current_thread) const { try_acquire(Thread *current_thread) const {
TAU_PROFILE("void MutexDebug::try_acquire(Thread *)", " ", TAU_USER); TAU_PROFILE("void MutexDebug::try_acquire(Thread *)", " ", TAU_USER);
nassertr(current_thread == Thread::get_current_thread(), false); nassertr(current_thread == Thread::get_current_thread(), false);
_global_lock->lock(); _global_lock.lock();
bool acquired = ((MutexDebug *)this)->do_try_lock(current_thread); bool acquired = ((MutexDebug *)this)->do_try_lock(current_thread);
_global_lock->unlock(); _global_lock.unlock();
return acquired; return acquired;
} }
@ -114,9 +114,9 @@ elevate_lock() const {
INLINE void MutexDebug:: INLINE void MutexDebug::
release() const { release() const {
TAU_PROFILE("void MutexDebug::release()", " ", TAU_USER); TAU_PROFILE("void MutexDebug::release()", " ", TAU_USER);
_global_lock->lock(); _global_lock.lock();
((MutexDebug *)this)->do_unlock(); ((MutexDebug *)this)->do_unlock();
_global_lock->unlock(); _global_lock.unlock();
} }
/** /**
@ -128,22 +128,8 @@ release() const {
INLINE bool MutexDebug:: INLINE bool MutexDebug::
debug_is_locked() const { debug_is_locked() const {
TAU_PROFILE("bool MutexDebug::debug_is_locked()", " ", TAU_USER); TAU_PROFILE("bool MutexDebug::debug_is_locked()", " ", TAU_USER);
_global_lock->lock(); _global_lock.lock();
bool is_locked = do_debug_is_locked(); bool is_locked = do_debug_is_locked();
_global_lock->unlock(); _global_lock.unlock();
return is_locked; return is_locked;
} }
/**
* Ensures the global MutexImpl pointer has been created, and returns its
* pointer. Since this method is called by the MutexDebug constructor, any
* other (non-static) methods of MutexDebug may simply assume that the pointer
* has already been created.
*/
INLINE MutexTrueImpl *MutexDebug::
get_global_lock() {
if (_global_lock == nullptr) {
_global_lock = new MutexTrueImpl;
}
return _global_lock;
}

View File

@ -21,7 +21,7 @@ using std::ostream;
using std::ostringstream; using std::ostringstream;
int MutexDebug::_pstats_count = 0; int MutexDebug::_pstats_count = 0;
MutexTrueImpl *MutexDebug::_global_lock; MutexTrueImpl MutexDebug::_global_lock;
/** /**
* *
@ -34,7 +34,7 @@ MutexDebug(const std::string &name, bool allow_recursion, bool lightweight) :
_locking_thread(nullptr), _locking_thread(nullptr),
_lock_count(0), _lock_count(0),
_deleted_name(nullptr), _deleted_name(nullptr),
_cvar_impl(*get_global_lock()) _cvar_impl(_global_lock)
{ {
#ifndef SIMPLE_THREADS #ifndef SIMPLE_THREADS
// If we're using real threads, there's no such thing as a lightweight // If we're using real threads, there's no such thing as a lightweight
@ -87,12 +87,12 @@ output(ostream &out) const {
*/ */
void MutexDebug:: void MutexDebug::
output_with_holder(ostream &out) const { output_with_holder(ostream &out) const {
_global_lock->lock(); _global_lock.lock();
output(out); output(out);
if (_locking_thread != nullptr) { if (_locking_thread != nullptr) {
out << " (held by " << *_locking_thread << ")\n"; out << " (held by " << *_locking_thread << ")\n";
} }
_global_lock->unlock(); _global_lock.unlock();
} }
/** /**
@ -102,9 +102,9 @@ output_with_holder(ostream &out) const {
*/ */
void MutexDebug:: void MutexDebug::
increment_pstats() { increment_pstats() {
_global_lock->lock(); _global_lock.lock();
++_pstats_count; ++_pstats_count;
_global_lock->unlock(); _global_lock.unlock();
} }
/** /**
@ -113,9 +113,9 @@ increment_pstats() {
*/ */
void MutexDebug:: void MutexDebug::
decrement_pstats() { decrement_pstats() {
_global_lock->lock(); _global_lock.lock();
--_pstats_count; --_pstats_count;
_global_lock->unlock(); _global_lock.unlock();
} }
/** /**

View File

@ -65,8 +65,6 @@ private:
void report_deadlock(Thread *current_thread); void report_deadlock(Thread *current_thread);
private: private:
INLINE static MutexTrueImpl *get_global_lock();
bool _allow_recursion; bool _allow_recursion;
bool _lightweight; bool _lightweight;
Thread *_locking_thread; Thread *_locking_thread;
@ -80,7 +78,7 @@ private:
ConditionVarImpl _cvar_impl; ConditionVarImpl _cvar_impl;
static int _pstats_count; static int _pstats_count;
static MutexTrueImpl *_global_lock; static MutexTrueImpl _global_lock;
friend class ConditionVarDebug; friend class ConditionVarDebug;
}; };