From 9a04808701654901cd1b6c1f2bd0871d57167ec9 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Wed, 29 May 2024 17:53:14 +0300 Subject: [PATCH 1/4] Flushing logs when received an exception(for windows only) or signal --- openVulkanoCpp/Base/Logger.cpp | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/openVulkanoCpp/Base/Logger.cpp b/openVulkanoCpp/Base/Logger.cpp index 6b02094..42caca6 100644 --- a/openVulkanoCpp/Base/Logger.cpp +++ b/openVulkanoCpp/Base/Logger.cpp @@ -9,6 +9,7 @@ #include "IO/AppFolders.hpp" #include #include +#include #include #include #ifndef NO_CONSOLE_LOG @@ -17,6 +18,10 @@ #ifdef _MSC_VER #include #endif +#ifdef _WIN32 +# include +# include +#endif namespace OpenVulkano { @@ -39,6 +44,43 @@ namespace OpenVulkano Logger::Ptr Logger::PERF = nullptr; Logger::Ptr Logger::APP = nullptr; + void signalHandler(int sigCode) + { + spdlog::error("Received signal {}", sigCode); + spdlog::shutdown(); + } + +#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) { if (logFolder.empty()) logFolder = (AppFolders::GetAppDataHomeDir() / "logs").string(); @@ -77,6 +119,8 @@ namespace OpenVulkano spdlog::flush_every(std::chrono::seconds(5)); + setupSignalHandlers(); + MANAGER->info("Logger initialized"); } catch (const spdlog::spdlog_ex& e) From 9d1ac4f61870d906bc31ec6804a665461964e2ca Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Wed, 29 May 2024 19:02:39 +0300 Subject: [PATCH 2/4] Exiting the app after receiving a signal --- openVulkanoCpp/Base/Logger.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openVulkanoCpp/Base/Logger.cpp b/openVulkanoCpp/Base/Logger.cpp index 42caca6..8c75cb9 100644 --- a/openVulkanoCpp/Base/Logger.cpp +++ b/openVulkanoCpp/Base/Logger.cpp @@ -48,6 +48,9 @@ namespace OpenVulkano { 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 From 7aa9d0eb82e8425cec2ac996eee38d827729cef1 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 30 May 2024 12:59:17 +0300 Subject: [PATCH 3/4] 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"); } From faff80e46e8693278bc9388ce62885277ad423a8 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 30 May 2024 14:15:16 +0300 Subject: [PATCH 4/4] Moved code back into OpenVulkano namespace, removed unnecessary comment --- openVulkanoCpp/Base/Logger.cpp | 79 +++++++++++++++++----------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/openVulkanoCpp/Base/Logger.cpp b/openVulkanoCpp/Base/Logger.cpp index 224c5fa..de3ca6c 100644 --- a/openVulkanoCpp/Base/Logger.cpp +++ b/openVulkanoCpp/Base/Logger.cpp @@ -23,45 +23,6 @@ # 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 { @@ -84,6 +45,44 @@ namespace OpenVulkano Logger::Ptr Logger::PERF = nullptr; Logger::Ptr Logger::APP = nullptr; + 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 + SetUnhandledExceptionFilter(win32ExceptionHandler); + #endif + } + } void Logger::SetupLogger(std::string logFolder, const std::string& logFile) { @@ -123,7 +122,7 @@ namespace OpenVulkano spdlog::flush_every(std::chrono::seconds(5)); - ::setupSignalHandlers(); + setupSignalHandlers(); MANAGER->info("Logger initialized"); }