summaryrefslogtreecommitdiffstats
path: root/src/DeadlockDetect.cpp
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2017-01-18 10:51:17 +0100
committerGitHub <noreply@github.com>2017-01-18 10:51:17 +0100
commit0256daa7ca98bab7482581dad39f66d570030874 (patch)
treede9232cbf239800ea1e7a71cf52086509a9472ea /src/DeadlockDetect.cpp
parentUpdated Github label links (#3543) (diff)
parentDeadlockDetect now lists some tracked CS's stats. (diff)
downloadcuberite-0256daa7ca98bab7482581dad39f66d570030874.tar
cuberite-0256daa7ca98bab7482581dad39f66d570030874.tar.gz
cuberite-0256daa7ca98bab7482581dad39f66d570030874.tar.bz2
cuberite-0256daa7ca98bab7482581dad39f66d570030874.tar.lz
cuberite-0256daa7ca98bab7482581dad39f66d570030874.tar.xz
cuberite-0256daa7ca98bab7482581dad39f66d570030874.tar.zst
cuberite-0256daa7ca98bab7482581dad39f66d570030874.zip
Diffstat (limited to 'src/DeadlockDetect.cpp')
-rw-r--r--src/DeadlockDetect.cpp73
1 files changed, 70 insertions, 3 deletions
diff --git a/src/DeadlockDetect.cpp b/src/DeadlockDetect.cpp
index 3141020d0..df14e610b 100644
--- a/src/DeadlockDetect.cpp
+++ b/src/DeadlockDetect.cpp
@@ -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:
@@ -121,7 +169,7 @@ void cDeadlockDetect::CheckWorldAge(const AString & a_WorldName, Int64 a_Age)
WorldAge.m_NumCyclesSame += 1;
if (WorldAge.m_NumCyclesSame > (m_IntervalSec * 1000) / CYCLE_MILLISECONDS)
{
- DeadlockDetected();
+ DeadlockDetected(a_WorldName, a_Age);
}
}
else
@@ -135,9 +183,12 @@ void cDeadlockDetect::CheckWorldAge(const AString & a_WorldName, Int64 a_Age)
-void cDeadlockDetect::DeadlockDetected(void)
+void cDeadlockDetect::DeadlockDetected(const AString & a_WorldName, Int64 a_WorldAge)
{
- LOGERROR("Deadlock detected, aborting the server");
+ 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();
}
@@ -145,3 +196,19 @@ void cDeadlockDetect::DeadlockDetected(void)
+
+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))
+ );
+ }
+}
+
+
+
+