Ignoring ctrl-c signals, checking whether logger did shut down, calling default signal handler
This commit is contained in:
@@ -23,6 +23,46 @@
|
||||
# include <dbghelp.h>
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
bool didLoggerShutdown = false;
|
||||
|
||||
void signalHandler(int sigCode)
|
||||
{
|
||||
if(!didLoggerShutdown)
|
||||
spdlog::error("Received signal {}", sigCode);
|
||||
spdlog::shutdown();
|
||||
didLoggerShutdown = true;
|
||||
std::raise(sigCode); // calls default handler
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
LONG WINAPI win32ExceptionHandler(EXCEPTION_POINTERS *exceptionPointers)
|
||||
{
|
||||
// NOTE(vb): We can report some of the exceptionPointers fields to the user... But this is for windows only
|
||||
if(!didLoggerShutdown)
|
||||
spdlog::error("An exception occured");
|
||||
spdlog::shutdown();
|
||||
didLoggerShutdown = true;
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
#endif
|
||||
|
||||
void setupSignalHandlers()
|
||||
{
|
||||
std::signal(SIGSEGV, signalHandler);
|
||||
std::signal(SIGABRT, signalHandler);
|
||||
std::signal(SIGFPE, signalHandler);
|
||||
std::signal(SIGILL, signalHandler);
|
||||
// std::signal(SIGINT, signalHandler);
|
||||
std::signal(SIGTERM, signalHandler);
|
||||
#ifdef _WIN32
|
||||
// SetConsoleCtrlHandler(handlerRoutine, TRUE);
|
||||
SetUnhandledExceptionFilter(win32ExceptionHandler);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
namespace OpenVulkano
|
||||
{
|
||||
|
||||
@@ -44,45 +84,6 @@ namespace OpenVulkano
|
||||
Logger::Ptr Logger::PERF = nullptr;
|
||||
Logger::Ptr Logger::APP = nullptr;
|
||||
|
||||
void signalHandler(int sigCode)
|
||||
{
|
||||
spdlog::error("Received signal {}", sigCode);
|
||||
spdlog::shutdown();
|
||||
// NOTE(vb): I'm not sure what function to call here and with what code: either std::exit() in order to
|
||||
// cleanup resources or std::_exit() which quits the app immediately
|
||||
std::exit(0);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
LONG WINAPI win32ExceptionHandler(EXCEPTION_POINTERS *exceptionPointers)
|
||||
{
|
||||
// NOTE(vb): We can report some of the exceptionPointers fields to the user... But this is for windows only
|
||||
spdlog::error("An exception occured");
|
||||
spdlog::shutdown();
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
BOOL WINAPI handlerRoutine(DWORD dwCtrlType)
|
||||
{
|
||||
// spdlog::error("Received CTRL-C, exiting...");
|
||||
spdlog::shutdown();
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
void setupSignalHandlers()
|
||||
{
|
||||
std::signal(SIGSEGV, signalHandler);
|
||||
std::signal(SIGABRT, signalHandler);
|
||||
std::signal(SIGFPE, signalHandler);
|
||||
std::signal(SIGILL, signalHandler);
|
||||
std::signal(SIGINT, signalHandler);
|
||||
std::signal(SIGTERM, signalHandler);
|
||||
#ifdef _WIN32
|
||||
SetConsoleCtrlHandler(handlerRoutine, TRUE);
|
||||
SetUnhandledExceptionFilter(win32ExceptionHandler);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Logger::SetupLogger(std::string logFolder, const std::string& logFile)
|
||||
{
|
||||
@@ -122,7 +123,7 @@ namespace OpenVulkano
|
||||
|
||||
spdlog::flush_every(std::chrono::seconds(5));
|
||||
|
||||
setupSignalHandlers();
|
||||
::setupSignalHandlers();
|
||||
|
||||
MANAGER->info("Logger initialized");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user