summaryrefslogtreecommitdiffstats
path: root/source/DeadlockDetect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/DeadlockDetect.cpp')
-rw-r--r--source/DeadlockDetect.cpp147
1 files changed, 0 insertions, 147 deletions
diff --git a/source/DeadlockDetect.cpp b/source/DeadlockDetect.cpp
deleted file mode 100644
index c774c9dce..000000000
--- a/source/DeadlockDetect.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-
-// DeadlockDetect.cpp
-
-// Declares the cDeadlockDetect class that tries to detect deadlocks and aborts the server when it detects one
-
-#include "Globals.h"
-#include "DeadlockDetect.h"
-#include "Root.h"
-#include "World.h"
-
-
-
-
-
-/// Number of milliseconds per cycle
-const int CYCLE_MILLISECONDS = 100;
-
-/// When the number of cycles for the same world age hits this value, it is considered a deadlock
-const int NUM_CYCLES_LIMIT = 200; // 200 = twenty seconds
-
-
-
-
-
-cDeadlockDetect::cDeadlockDetect(void) :
- super("DeadlockDetect")
-{
-}
-
-
-
-
-
-bool cDeadlockDetect::Start(void)
-{
- // Read the initial world data:
- class cFillIn :
- public cWorldListCallback
- {
- public:
- cFillIn(cDeadlockDetect * a_Detect) :
- m_Detect(a_Detect)
- {
- }
-
- virtual bool Item(cWorld * a_World) override
- {
- m_Detect->SetWorldAge(a_World->GetName(), a_World->GetWorldAge());
- return false;
- }
-
- protected:
- cDeadlockDetect * m_Detect;
- } FillIn(this);
- cRoot::Get()->ForEachWorld(FillIn);
- return super::Start();
-}
-
-
-
-
-
-void cDeadlockDetect::Execute(void)
-{
- // Loop until the signal to terminate:
- while (!m_ShouldTerminate)
- {
- // Check the world ages:
- class cChecker :
- public cWorldListCallback
- {
- public:
- cChecker(cDeadlockDetect * a_Detect) :
- m_Detect(a_Detect)
- {
- }
-
- protected:
- cDeadlockDetect * m_Detect;
-
- virtual bool Item(cWorld * a_World) override
- {
- m_Detect->CheckWorldAge(a_World->GetName(), a_World->GetWorldAge());
- return false;
- }
- } Checker(this);
- cRoot::Get()->ForEachWorld(Checker);
-
- cSleep::MilliSleep(CYCLE_MILLISECONDS);
- } // while (should run)
-}
-
-
-
-
-
-void cDeadlockDetect::SetWorldAge(const AString & a_WorldName, Int64 a_Age)
-{
- m_WorldAges[a_WorldName].m_Age = a_Age;
- m_WorldAges[a_WorldName].m_NumCyclesSame = 0;
-}
-
-
-
-
-
-void cDeadlockDetect::CheckWorldAge(const AString & a_WorldName, Int64 a_Age)
-{
- WorldAges::iterator itr = m_WorldAges.find(a_WorldName);
- if (itr == m_WorldAges.end())
- {
- ASSERT(!"Unknown world in cDeadlockDetect");
- return;
- }
- if (itr->second.m_Age == a_Age)
- {
- itr->second.m_NumCyclesSame += 1;
- if (itr->second.m_NumCyclesSame > NUM_CYCLES_LIMIT)
- {
- DeadlockDetected();
- return;
- }
- }
- else
- {
- itr->second.m_Age = a_Age;
- itr->second.m_NumCyclesSame = 0;
- }
-}
-
-
-
-
-
-void cDeadlockDetect::DeadlockDetected(void)
-{
- ASSERT(!"Deadlock detected");
-
- // TODO: Make a crashdump / coredump
-
- // Crash the server intentionally:
- *((volatile int *)0) = 0;
-}
-
-
-
-