From 92a87a0c64f58a96227827b148cd3a79bc145e39 Mon Sep 17 00:00:00 2001 From: peri4 Date: Tue, 15 Oct 2024 15:04:39 +0300 Subject: [PATCH] picloud add "-w" option for watchdog --- utils/cloud_dispatcher/dispatcherserver.cpp | 18 ++++++++++++++++++ utils/cloud_dispatcher/dispatcherserver.h | 3 +++ utils/cloud_dispatcher/main.cpp | 15 +++++++++------ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/utils/cloud_dispatcher/dispatcherserver.cpp b/utils/cloud_dispatcher/dispatcherserver.cpp index ad581fbd..3b25990f 100644 --- a/utils/cloud_dispatcher/dispatcherserver.cpp +++ b/utils/cloud_dispatcher/dispatcherserver.cpp @@ -45,6 +45,7 @@ void DispatcherServer::picoutStatus() { void DispatcherServer::cleanClients() { + wd_cnt++; PIMutexLocker locker(map_mutex); for (auto s: rmrf_servers) s->close(); @@ -194,6 +195,23 @@ void DispatcherServer::setMaxConnections(uint max_count) { } +void DispatcherServer::startWatchdog() { + wd_cnt++; + PIThread * thread = new PIThread( + [this]() { + if (wd_cnt == 0) { + piCout << "Deadlock detected, abort"; + std::abort(); + return; + } + wd_cnt = 0; + }, + true, + 10_s); + NO_UNUSED(thread); +} + + void DispatcherServer::disconnectClient(DispatcherClient * client) { PIMutexLocker locker(map_mutex); if (!clients.contains(client)) { diff --git a/utils/cloud_dispatcher/dispatcherserver.h b/utils/cloud_dispatcher/dispatcherserver.h index 28611525..fc4d3a1e 100644 --- a/utils/cloud_dispatcher/dispatcherserver.h +++ b/utils/cloud_dispatcher/dispatcherserver.h @@ -25,6 +25,8 @@ public: uint maxConnections() const { return max_connections; } EVENT_HANDLER0(void, picoutStatus); + void startWatchdog(); + private: EVENT_HANDLER1(void, newConnection, PIEthernet *, cl); EVENT_HANDLER1(void, disconnectClient, DispatcherClient *, client); @@ -40,6 +42,7 @@ private: PIVector rmrf_servers; PITimer timeout_timer; PIMutex map_mutex; + std::atomic_int wd_cnt = {0}; uint client_gid; uint max_connections; }; diff --git a/utils/cloud_dispatcher/main.cpp b/utils/cloud_dispatcher/main.cpp index 273e1893..e210a488 100644 --- a/utils/cloud_dispatcher/main.cpp +++ b/utils/cloud_dispatcher/main.cpp @@ -34,13 +34,14 @@ using namespace PICoutManipulators; void usage() { piCout << Bold << "PIP Cloud Dispatcher"; piCout << Cyan << "Version" << Bold << PIPVersion() << NewLine; - piCout << Green << Bold << "Usage:" << Default << "\"picloud [-hsv] [-i ] [-p ]\"" << NewLine; + piCout << Green << Bold << "Usage:" << Default << "\"picloud [-hswv] [-i ] [-p ]\"" << NewLine; piCout << Green << Bold << "Details:"; - piCout << "-h --help " << Green << "- display this message and exit"; - piCout << "-i --ip " << Green << "- listen address, default \"0.0.0.0\""; - piCout << "-p --port " << Green << "- listen port, default 10101"; - piCout << "-s --screen " << Green << "- start with console UI"; - piCout << "-v --verbose" << Green << "- print state (--screen ignore this flag)"; + piCout << "-h --help " << Green << "- display this message and exit"; + piCout << "-i --ip " << Green << "- listen address, default \"0.0.0.0\""; + piCout << "-p --port " << Green << "- listen port, default 10101"; + piCout << "-s --screen " << Green << "- start with console UI"; + piCout << "-w --watchdog" << Green << "- kill itself on deadlock"; + piCout << "-v --verbose " << Green << "- print state (--screen ignore this flag)"; } @@ -64,6 +65,7 @@ int main(int argc, char * argv[]) { cli.addArgument("ip", true); cli.addArgument("port", true); cli.addArgument("screen"); + cli.addArgument("watchdog"); cli.addArgument("verbose"); if (cli.hasArgument("help")) { @@ -154,6 +156,7 @@ int main(int argc, char * argv[]) { ls.enableExitCapture(PIKbdListener::F10); ls.start(); server.start(); + if (cli.hasArgument("watchdog")) server.startWatchdog(); if (cli.hasArgument("verbose")) { CONNECTU(&status_timer, tickEvent, &server, picoutStatus); status_timer.start(1_Hz);