mirror of
https://github.com/BeamMP/BeamMP-Server.git
synced 2025-07-01 23:35:41 +00:00
Main: Add Ctrl+C handler for windows
This commit is contained in:
parent
0f9f81e9fa
commit
a514591650
@ -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}")
|
||||||
|
|
||||||
|
@ -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
68
include/SignalHandling.h
Normal 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
|
43
src/main.cpp
43
src/main.cpp
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user