Main: Add Ctrl+C handler for windows

This commit is contained in:
Lion Kortlepel 2021-09-09 11:37:56 +03:00 committed by Lion
parent 0f9f81e9fa
commit a514591650
4 changed files with 83 additions and 35 deletions

View File

@ -81,7 +81,8 @@ add_executable(BeamMP-Server
include/Http.h src/Http.cpp include/Http.h src/Http.cpp
include/TSentry.h src/TSentry.cpp include/TSentry.h src/TSentry.cpp
include/TPPSMonitor.h src/TPPSMonitor.cpp include/TPPSMonitor.h src/TPPSMonitor.cpp
include/TNetwork.h src/TNetwork.cpp) include/TNetwork.h src/TNetwork.cpp
include/SignalHandling.h)
target_compile_definitions(BeamMP-Server PRIVATE SECRET_SENTRY_URL="${BEAMMP_SECRET_SENTRY_URL}") target_compile_definitions(BeamMP-Server PRIVATE SECRET_SENTRY_URL="${BEAMMP_SECRET_SENTRY_URL}")

View File

@ -1,3 +1,7 @@
# v2.3.2
- ADDED Ctrl+C and closing the console causing a graceful shutdown
# v2.3.1 # v2.3.1
- CHANGED join/sync timeout to 20 minutes, players wont drop if loading takes >5 mins - CHANGED join/sync timeout to 20 minutes, players wont drop if loading takes >5 mins

68
include/SignalHandling.h Normal file
View File

@ -0,0 +1,68 @@
#pragma once
#include "Common.h"
#ifdef __unix
#include <csignal>
static void UnixSignalHandler(int sig) {
switch (sig) {
case SIGPIPE:
warn("ignoring SIGPIPE");
break;
case SIGTERM:
info("gracefully shutting down via SIGTERM");
Application::GracefullyShutdown();
break;
case SIGINT:
info("gracefully shutting down via SIGINT");
Application::GracefullyShutdown();
break;
default:
debug("unhandled signal: " + std::to_string(sig));
break;
}
}
#endif // __unix
#ifdef WIN32
#include <windows.h>
// return TRUE if handled, FALSE if not
BOOL WINAPI Win32CtrlC_Handler(DWORD CtrlType) {
switch (CtrlType) {
case CTRL_C_EVENT:
info("gracefully shutting down via CTRL+C");
Application::GracefullyShutdown();
return TRUE;
case CTRL_BREAK_EVENT:
info("gracefully shutting down via CTRL+BREAK");
Application::GracefullyShutdown();
return TRUE;
case CTRL_CLOSE_EVENT:
info("gracefully shutting down via close");
Application::GracefullyShutdown();
return TRUE;
}
// we dont care for any others like CTRL_LOGOFF_EVENT and CTRL_SHUTDOWN_EVENT
return FALSE;
}
#endif // WIN32
// clang-format off
static void SetupSignalHandlers() {
// signal handlers for unix
#ifdef __unix
trace("registering handlers for SIGINT, SIGTERM, SIGPIPE");
signal(SIGPIPE, UnixSignalHandler);
signal(SIGTERM, UnixSignalHandler);
#ifndef DEBUG
signal(SIGINT, UnixSignalHandler);
#endif // DEBUG
#endif // __unix
// signal handlers for win32
#ifdef WIN32
trace("registering handlers for CTRL_*_EVENTs");
SetConsoleCtrlHandler(Win32CtrlC_Handler, TRUE);
#endif // WIN32
}
// clang-format on

View File

@ -10,49 +10,20 @@
#include "TPPSMonitor.h" #include "TPPSMonitor.h"
#include "TResourceManager.h" #include "TResourceManager.h"
#include "TServer.h" #include "TServer.h"
#include "SignalHandling.h"
#include <iostream>
#include <thread> #include <thread>
#ifdef __unix
#include <csignal>
void UnixSignalHandler(int sig) {
switch (sig) {
case SIGPIPE:
warn("ignoring SIGPIPE");
break;
case SIGTERM:
info("gracefully shutting down via SIGTERM");
Application::GracefullyShutdown();
break;
case SIGINT:
info("gracefully shutting down via SIGINT");
Application::GracefullyShutdown();
break;
default:
debug("unhandled signal: " + std::to_string(sig));
break;
}
}
#endif // __unix
// this is provided by the build system, leave empty for source builds // this is provided by the build system, leave empty for source builds
// global, yes, this is ugly, no, it cant be done another way // global, yes, this is ugly, no, it cant be done another way
TSentry Sentry {}; TSentry Sentry {};
#include <iostream>
int main(int argc, char** argv) try { int main(int argc, char** argv) try {
#ifdef __unix
trace("registering handlers for SIGINT, SIGTERM, SIGPIPE");
signal(SIGPIPE, UnixSignalHandler);
signal(SIGTERM, UnixSignalHandler);
#ifndef DEBUG
signal(SIGINT, UnixSignalHandler);
#endif // DEBUG
#endif // __unix
setlocale(LC_ALL, "C"); setlocale(LC_ALL, "C");
SetupSignalHandlers();
bool Shutdown = false; bool Shutdown = false;
Application::RegisterShutdownHandler([&Shutdown] { Shutdown = true; }); Application::RegisterShutdownHandler([&Shutdown] { Shutdown = true; });
@ -61,7 +32,10 @@ int main(int argc, char** argv) try {
if (Config.Failed()) { if (Config.Failed()) {
info("Closing in 10 seconds"); info("Closing in 10 seconds");
std::this_thread::sleep_for(std::chrono::seconds(10)); // loop to make it possible to ctrl+c instead
for (size_t i = 0; i < 20; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
return 1; return 1;
} }
@ -88,3 +62,4 @@ int main(int argc, char** argv) try {
error(e.what()); error(e.what());
Sentry.LogException(e, _file_basename, _line); Sentry.LogException(e, _file_basename, _line);
} }