@ -923,16 +923,22 @@ string FormatFullVersion()
struct CLockLocation
struct CLockLocation
{
{
std : : string mutexName ;
std : : string sourceFile ;
int sourceLine ;
CLockLocation ( const char * pszName , const char * pszFile , int nLine )
CLockLocation ( const char * pszName , const char * pszFile , int nLine )
{
{
mutexName = pszName ;
mutexName = pszName ;
sourceFile = pszFile ;
sourceFile = pszFile ;
sourceLine = nLine ;
sourceLine = nLine ;
}
}
std : : string ToString ( ) const
{
return mutexName + " " + sourceFile + " : " + itostr ( sourceLine ) ;
}
private :
std : : string mutexName ;
std : : string sourceFile ;
int sourceLine ;
} ;
} ;
typedef std : : vector < std : : pair < CCriticalSection * , CLockLocation > > LockStack ;
typedef std : : vector < std : : pair < CCriticalSection * , CLockLocation > > LockStack ;
@ -950,14 +956,14 @@ static void potential_deadlock_detected(const std::pair<CCriticalSection*, CCrit
{
{
if ( i . first = = mismatch . first ) printf ( " (1) " ) ;
if ( i . first = = mismatch . first ) printf ( " (1) " ) ;
if ( i . first = = mismatch . second ) printf ( " (2) " ) ;
if ( i . first = = mismatch . second ) printf ( " (2) " ) ;
printf ( " %s %s:%d \n " , i . second . mutexName . c_str ( ) , i . second . sourceFile . c_str ( ) , i . second . sourceLine ) ;
printf ( " %s \n " , i . second . ToString ( ) . c_str ( ) ) ;
}
}
printf ( " Current lock order is: \n " ) ;
printf ( " Current lock order is: \n " ) ;
BOOST_FOREACH ( const PAIRTYPE ( CCriticalSection * , CLockLocation ) & i , s1 )
BOOST_FOREACH ( const PAIRTYPE ( CCriticalSection * , CLockLocation ) & i , s1 )
{
{
if ( i . first = = mismatch . first ) printf ( " (1) " ) ;
if ( i . first = = mismatch . first ) printf ( " (1) " ) ;
if ( i . first = = mismatch . second ) printf ( " (2) " ) ;
if ( i . first = = mismatch . second ) printf ( " (2) " ) ;
printf ( " %s %s:%d \n " , i . second . mutexName . c_str ( ) , i . second . sourceFile . c_str ( ) , i . second . sourceLine ) ;
printf ( " %s \n " , i . second . ToString ( ) . c_str ( ) ) ;
}
}
}
}
@ -967,6 +973,7 @@ static void push_lock(CCriticalSection* c, const CLockLocation& locklocation)
if ( lockstack . get ( ) = = NULL )
if ( lockstack . get ( ) = = NULL )
lockstack . reset ( new LockStack ) ;
lockstack . reset ( new LockStack ) ;
if ( fDebug ) printf ( " Locking: %s \n " , locklocation . ToString ( ) . c_str ( ) ) ;
dd_mutex . lock ( ) ;
dd_mutex . lock ( ) ;
( * lockstack ) . push_back ( std : : make_pair ( c , locklocation ) ) ;
( * lockstack ) . push_back ( std : : make_pair ( c , locklocation ) ) ;
@ -992,7 +999,14 @@ static void push_lock(CCriticalSection* c, const CLockLocation& locklocation)
static void pop_lock ( )
static void pop_lock ( )
{
{
if ( fDebug )
{
const CLockLocation & locklocation = ( * lockstack ) . rbegin ( ) - > second ;
printf ( " Unlocked: %s \n " , locklocation . ToString ( ) . c_str ( ) ) ;
}
dd_mutex . lock ( ) ;
( * lockstack ) . pop_back ( ) ;
( * lockstack ) . pop_back ( ) ;
dd_mutex . unlock ( ) ;
}
}
void CCriticalSection : : Enter ( const char * pszName , const char * pszFile , int nLine )
void CCriticalSection : : Enter ( const char * pszName , const char * pszFile , int nLine )