mutex debugging routines: LocksHeld() and AssertLockHeld()

This commit is contained in:
Gavin Andresen
2013-11-29 17:25:30 +10:00
parent 207cfbfbf1
commit c649637b6c
3 changed files with 23 additions and 0 deletions

View File

@@ -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()
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 */