Browse Source

mutex debugging routines: LocksHeld() and AssertLockHeld()

0.10
Gavin Andresen 11 years ago
parent
commit
c649637b6c
  1. 2
      src/main.cpp
  2. 18
      src/sync.cpp
  3. 3
      src/sync.h

2
src/main.cpp

@ -2215,6 +2215,8 @@ void PushGetBlocks(CNode* pnode, CBlockIndex* pindexBegin, uint256 hashEnd) @@ -2215,6 +2215,8 @@ void PushGetBlocks(CNode* pnode, CBlockIndex* pindexBegin, uint256 hashEnd)
bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBlockPos *dbp)
{
AssertLockHeld("cs_main");
// Check for duplicate
uint256 hash = pblock->GetHash();
if (mapBlockIndex.count(hash))

18
src/sync.cpp

@ -42,6 +42,8 @@ struct CLockLocation @@ -42,6 +42,8 @@ struct CLockLocation
return mutexName+" "+sourceFile+":"+itostr(sourceLine);
}
std::string MutexName() const { return mutexName; }
private:
std::string mutexName;
std::string sourceFile;
@ -126,4 +128,20 @@ void LeaveCritical() @@ -126,4 +128,20 @@ void LeaveCritical()
pop_lock();
}
std::string LocksHeld()
{
std::string result;
BOOST_FOREACH(const PAIRTYPE(void*, CLockLocation)&i, *lockstack)
result += i.second.ToString() + std::string("\n");
return result;
}
void AssertLockHeld(std::string strName)
{
BOOST_FOREACH(const PAIRTYPE(void*, CLockLocation)&i, *lockstack)
if (i.second.MutexName() == strName) return;
LogPrintf("Lock %s not held; locks held:\n%s", strName.c_str(), LocksHeld().c_str());
assert(0);
}
#endif /* DEBUG_LOCKORDER */

3
src/sync.h

@ -87,9 +87,12 @@ typedef AnnotatedMixin<boost::mutex> CWaitableCriticalSection; @@ -87,9 +87,12 @@ typedef AnnotatedMixin<boost::mutex> CWaitableCriticalSection;
#ifdef DEBUG_LOCKORDER
void EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false);
void LeaveCritical();
std::string LocksHeld();
void AssertLockHeld(std::string strName);
#else
void static inline EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false) {}
void static inline LeaveCritical() {}
void static inline AssertLockHeld(std::string) {}
#endif
#ifdef DEBUG_LOCKCONTENTION

Loading…
Cancel
Save