picloud add "-w" option for watchdog
This commit is contained in:
@@ -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)) {
|
||||
|
||||
@@ -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<CloudServer *> rmrf_servers;
|
||||
PITimer timeout_timer;
|
||||
PIMutex map_mutex;
|
||||
std::atomic_int wd_cnt = {0};
|
||||
uint client_gid;
|
||||
uint max_connections;
|
||||
};
|
||||
|
||||
@@ -34,12 +34,13 @@ using namespace PICoutManipulators;
|
||||
void usage() {
|
||||
piCout << Bold << "PIP Cloud Dispatcher";
|
||||
piCout << Cyan << "Version" << Bold << PIPVersion() << NewLine;
|
||||
piCout << Green << Bold << "Usage:" << Default << "\"picloud [-hsv] [-i <ip>] [-p <port>]\"" << NewLine;
|
||||
piCout << Green << Bold << "Usage:" << Default << "\"picloud [-hswv] [-i <ip>] [-p <port>]\"" << 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 << "-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);
|
||||
|
||||
Reference in New Issue
Block a user