diff options
Diffstat (limited to 'src/helpers/Watchdog.cpp')
-rw-r--r-- | src/helpers/Watchdog.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/helpers/Watchdog.cpp b/src/helpers/Watchdog.cpp new file mode 100644 index 00000000..92f20dfb --- /dev/null +++ b/src/helpers/Watchdog.cpp @@ -0,0 +1,49 @@ +#include "Watchdog.hpp" +#include <signal.h> +#include "config/ConfigManager.hpp" + +CWatchdog::CWatchdog() { + m_iMainThreadPID = pthread_self(); + + m_pWatchdog = std::make_unique<std::thread>([this] { + static auto* const PTIMEOUT = &g_pConfigManager->getConfigValuePtr("debug:watchdog_timeout")->intValue; + + while (1337) { + std::unique_lock lk(m_mWatchdogMutex); + + if (!m_bWillWatch) + m_cvWatchdogCondition.wait(lk, [this] { return m_bNotified; }); + else { + if (m_cvWatchdogCondition.wait_for(lk, std::chrono::milliseconds((int)(*PTIMEOUT * 1000.0)), [this] { return m_bNotified; }) == false) + pthread_kill(m_iMainThreadPID, SIGUSR1); + } + + m_bWatching = false; + m_bNotified = false; + } + }); + + m_pWatchdog->detach(); +} + +void CWatchdog::startWatching() { + static auto* const PTIMEOUT = &g_pConfigManager->getConfigValuePtr("debug:watchdog_timeout")->intValue; + + if (*PTIMEOUT == 0) + return; + + m_tTriggered = std::chrono::high_resolution_clock::now(); + m_bWillWatch = true; + m_bWatching = true; + + m_bNotified = true; + m_cvWatchdogCondition.notify_all(); +} + +void CWatchdog::endWatching() { + m_bWatching = false; + m_bWillWatch = false; + + m_bNotified = true; + m_cvWatchdogCondition.notify_all(); +}
\ No newline at end of file |