From 7aa9d0eb82e8425cec2ac996eee38d827729cef1 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 30 May 2024 12:59:17 +0300 Subject: [PATCH] Ignoring ctrl-c signals, checking whether logger did shut down, calling default signal handler --- openVulkanoCpp/Base/Logger.cpp | 81 +++++++++++++++++----------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/openVulkanoCpp/Base/Logger.cpp b/openVulkanoCpp/Base/Logger.cpp index 8c75cb9..224c5fa 100644 --- a/openVulkanoCpp/Base/Logger.cpp +++ b/openVulkanoCpp/Base/Logger.cpp @@ -23,6 +23,46 @@ # include #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"); }