picloud add "-w" option for watchdog
This commit is contained in:
@@ -45,6 +45,7 @@ void DispatcherServer::picoutStatus() {
|
|||||||
|
|
||||||
|
|
||||||
void DispatcherServer::cleanClients() {
|
void DispatcherServer::cleanClients() {
|
||||||
|
wd_cnt++;
|
||||||
PIMutexLocker locker(map_mutex);
|
PIMutexLocker locker(map_mutex);
|
||||||
for (auto s: rmrf_servers)
|
for (auto s: rmrf_servers)
|
||||||
s->close();
|
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) {
|
void DispatcherServer::disconnectClient(DispatcherClient * client) {
|
||||||
PIMutexLocker locker(map_mutex);
|
PIMutexLocker locker(map_mutex);
|
||||||
if (!clients.contains(client)) {
|
if (!clients.contains(client)) {
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ public:
|
|||||||
uint maxConnections() const { return max_connections; }
|
uint maxConnections() const { return max_connections; }
|
||||||
EVENT_HANDLER0(void, picoutStatus);
|
EVENT_HANDLER0(void, picoutStatus);
|
||||||
|
|
||||||
|
void startWatchdog();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EVENT_HANDLER1(void, newConnection, PIEthernet *, cl);
|
EVENT_HANDLER1(void, newConnection, PIEthernet *, cl);
|
||||||
EVENT_HANDLER1(void, disconnectClient, DispatcherClient *, client);
|
EVENT_HANDLER1(void, disconnectClient, DispatcherClient *, client);
|
||||||
@@ -40,6 +42,7 @@ private:
|
|||||||
PIVector<CloudServer *> rmrf_servers;
|
PIVector<CloudServer *> rmrf_servers;
|
||||||
PITimer timeout_timer;
|
PITimer timeout_timer;
|
||||||
PIMutex map_mutex;
|
PIMutex map_mutex;
|
||||||
|
std::atomic_int wd_cnt = {0};
|
||||||
uint client_gid;
|
uint client_gid;
|
||||||
uint max_connections;
|
uint max_connections;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -34,13 +34,14 @@ using namespace PICoutManipulators;
|
|||||||
void usage() {
|
void usage() {
|
||||||
piCout << Bold << "PIP Cloud Dispatcher";
|
piCout << Bold << "PIP Cloud Dispatcher";
|
||||||
piCout << Cyan << "Version" << Bold << PIPVersion() << NewLine;
|
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 << Green << Bold << "Details:";
|
||||||
piCout << "-h --help " << Green << "- display this message and exit";
|
piCout << "-h --help " << Green << "- display this message and exit";
|
||||||
piCout << "-i --ip " << Green << "- listen address, default \"0.0.0.0\"";
|
piCout << "-i --ip " << Green << "- listen address, default \"0.0.0.0\"";
|
||||||
piCout << "-p --port " << Green << "- listen port, default 10101";
|
piCout << "-p --port " << Green << "- listen port, default 10101";
|
||||||
piCout << "-s --screen " << Green << "- start with console UI";
|
piCout << "-s --screen " << Green << "- start with console UI";
|
||||||
piCout << "-v --verbose" << Green << "- print state (--screen ignore this flag)";
|
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("ip", true);
|
||||||
cli.addArgument("port", true);
|
cli.addArgument("port", true);
|
||||||
cli.addArgument("screen");
|
cli.addArgument("screen");
|
||||||
|
cli.addArgument("watchdog");
|
||||||
cli.addArgument("verbose");
|
cli.addArgument("verbose");
|
||||||
|
|
||||||
if (cli.hasArgument("help")) {
|
if (cli.hasArgument("help")) {
|
||||||
@@ -154,6 +156,7 @@ int main(int argc, char * argv[]) {
|
|||||||
ls.enableExitCapture(PIKbdListener::F10);
|
ls.enableExitCapture(PIKbdListener::F10);
|
||||||
ls.start();
|
ls.start();
|
||||||
server.start();
|
server.start();
|
||||||
|
if (cli.hasArgument("watchdog")) server.startWatchdog();
|
||||||
if (cli.hasArgument("verbose")) {
|
if (cli.hasArgument("verbose")) {
|
||||||
CONNECTU(&status_timer, tickEvent, &server, picoutStatus);
|
CONNECTU(&status_timer, tickEvent, &server, picoutStatus);
|
||||||
status_timer.start(1_Hz);
|
status_timer.start(1_Hz);
|
||||||
|
|||||||
Reference in New Issue
Block a user