diff options
author | madmaxoft <github@xoft.cz> | 2013-08-14 22:39:12 +0200 |
---|---|---|
committer | madmaxoft <github@xoft.cz> | 2013-08-14 22:39:12 +0200 |
commit | 50205bc4df3c272b88a5edd81a35ac0aca8213d5 (patch) | |
tree | bfd62cc2bea2d74411acfdc99ffc2ef8d0fffc50 /source/DeadlockDetect.h | |
parent | Fixed world's a_Dt parameter getting time values in wrong units. (diff) | |
download | cuberite-50205bc4df3c272b88a5edd81a35ac0aca8213d5.tar cuberite-50205bc4df3c272b88a5edd81a35ac0aca8213d5.tar.gz cuberite-50205bc4df3c272b88a5edd81a35ac0aca8213d5.tar.bz2 cuberite-50205bc4df3c272b88a5edd81a35ac0aca8213d5.tar.lz cuberite-50205bc4df3c272b88a5edd81a35ac0aca8213d5.tar.xz cuberite-50205bc4df3c272b88a5edd81a35ac0aca8213d5.tar.zst cuberite-50205bc4df3c272b88a5edd81a35ac0aca8213d5.zip |
Diffstat (limited to 'source/DeadlockDetect.h')
-rw-r--r-- | source/DeadlockDetect.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/source/DeadlockDetect.h b/source/DeadlockDetect.h new file mode 100644 index 000000000..bbd76826a --- /dev/null +++ b/source/DeadlockDetect.h @@ -0,0 +1,70 @@ + +// DeadlockDetect.h + +// Declares the cDeadlockDetect class that tries to detect deadlocks and aborts the server when it detects one + +/* +This class simply monitors each world's m_WorldAge, which is expected to grow on each tick. +If the world age doesn't grow for several seconds, it's either because the server is super-overloaded, +or because the world tick thread hangs in a deadlock. We presume the latter and therefore kill the server. +Once we learn to write crashdumps programmatically, we should do so just before killing, to enable debugging. +*/ + + + +#pragma once + +#include "OSSupport/IsThread.h" + + + + + +class cDeadlockDetect : + public cIsThread +{ + typedef cIsThread super; + +public: + cDeadlockDetect(void); + + /// Starts the detection. Hides cIsThread's Start, because we need some initialization + bool Start(void); + + /// Stops the detection. Hides cIsThread's Stop, because we need to signal m_EvtTerminate + void Stop(void); + +protected: + struct sWorldAge + { + /// Last m_WorldAge that has been detected in this world + Int64 m_Age; + + /// Number of cycles for which the age has been the same + int m_NumCyclesSame; + } ; + + /// Maps world name -> sWorldAge + typedef std::map<AString, sWorldAge> WorldAges; + + WorldAges m_WorldAges; + + cEvent m_EvtTerminate; + + + // cIsThread overrides: + virtual void Execute(void) override; + + /// Sets the initial world age + void SetWorldAge(const AString & a_WorldName, Int64 a_Age); + + /// Checks if the world's age has changed, updates the world's stats; calls DeadlockDetected() if deadlock detected + void CheckWorldAge(const AString & a_WorldName, Int64 a_Age); + + /// Called when a deadlock is detected. Aborts the server. + void DeadlockDetected(void); +} ; + + + + |