DeadlockDetect now lists some tracked CS's stats.
This commit is contained in:
@@ -30,6 +30,27 @@ cDeadlockDetect::cDeadlockDetect(void) :
|
||||
|
||||
|
||||
|
||||
cDeadlockDetect::~cDeadlockDetect()
|
||||
{
|
||||
// Check that all tracked CSs have been removed, report any remaining:
|
||||
cCSLock lock(m_CS);
|
||||
if (!m_TrackedCriticalSections.empty())
|
||||
{
|
||||
LOGWARNING("DeadlockDetect: Some CS objects (%u) haven't been removed from tracking", static_cast<unsigned>(m_TrackedCriticalSections.size()));
|
||||
for (const auto & tcs: m_TrackedCriticalSections)
|
||||
{
|
||||
LOGWARNING(" CS %p / %s",
|
||||
static_cast<void *>(tcs.first),
|
||||
tcs.second.c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool cDeadlockDetect::Start(int a_IntervalSec)
|
||||
{
|
||||
m_IntervalSec = a_IntervalSec;
|
||||
@@ -61,6 +82,33 @@ bool cDeadlockDetect::Start(int a_IntervalSec)
|
||||
|
||||
|
||||
|
||||
void cDeadlockDetect::TrackCriticalSection(cCriticalSection & a_CS, const AString & a_Name)
|
||||
{
|
||||
cCSLock lock(m_CS);
|
||||
m_TrackedCriticalSections.emplace_back(std::make_pair(&a_CS, a_Name));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cDeadlockDetect::UntrackCriticalSection(cCriticalSection & a_CS)
|
||||
{
|
||||
cCSLock lock(m_CS);
|
||||
for (auto itr = m_TrackedCriticalSections.begin(), end = m_TrackedCriticalSections.end(); itr != end; ++itr)
|
||||
{
|
||||
if (itr->first == &a_CS)
|
||||
{
|
||||
m_TrackedCriticalSections.erase(itr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cDeadlockDetect::Execute(void)
|
||||
{
|
||||
// Loop until the signal to terminate:
|
||||
@@ -140,6 +188,7 @@ void cDeadlockDetect::DeadlockDetected(const AString & a_WorldName, Int64 a_Worl
|
||||
LOGERROR("Deadlock detected: world %s has been stuck at age %lld. Aborting the server.",
|
||||
a_WorldName.c_str(), static_cast<long long>(a_WorldAge)
|
||||
);
|
||||
ListTrackedCSs();
|
||||
ASSERT(!"Deadlock detected");
|
||||
abort();
|
||||
}
|
||||
@@ -147,3 +196,19 @@ void cDeadlockDetect::DeadlockDetected(const AString & a_WorldName, Int64 a_Worl
|
||||
|
||||
|
||||
|
||||
|
||||
void cDeadlockDetect::ListTrackedCSs(void)
|
||||
{
|
||||
cCSLock lock(m_CS);
|
||||
for (const auto & cs: m_TrackedCriticalSections)
|
||||
{
|
||||
LOG("CS at %p, %s: RecursionCount = %d, ThreadIDHash = %04llx",
|
||||
static_cast<void *>(cs.first), cs.second.c_str(),
|
||||
cs.first->m_RecursionCount, static_cast<UInt64>(std::hash<std::thread::id>()(cs.first->m_OwningThreadID))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user