mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
pipeline: revert change causing shutdown crash with DEBUG_THREADS
We actually need to leak this lock, because we need to call this at static destruction time, and we can't guarantee static destruction order. This reverts commit afed80e83a5c033f03497bcf38353794e662eedf.
This commit is contained in:
parent
95f3e30d37
commit
ff2fbe60ef
@ -29,7 +29,7 @@ using std::ostringstream;
|
|||||||
ConditionVarDebug::
|
ConditionVarDebug::
|
||||||
ConditionVarDebug(MutexDebug &mutex) :
|
ConditionVarDebug(MutexDebug &mutex) :
|
||||||
_mutex(mutex),
|
_mutex(mutex),
|
||||||
_impl(mutex._global_lock)
|
_impl(*mutex.get_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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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,8 +128,22 @@ 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;
|
||||||
|
}
|
||||||
|
@ -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(_global_lock)
|
_cvar_impl(*get_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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,6 +65,8 @@ 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;
|
||||||
@ -78,7 +80,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;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user