diff --git a/openVulkanoCpp/Base/Logger.cpp b/openVulkanoCpp/Base/Logger.cpp index 6b02094..de3ca6c 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,11 @@ #ifdef _MSC_VER #include #endif +#ifdef _WIN32 +# include +# include +#endif + namespace OpenVulkano { @@ -39,6 +45,45 @@ 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) { if (logFolder.empty()) logFolder = (AppFolders::GetAppDataHomeDir() / "logs").string(); @@ -77,6 +122,8 @@ namespace OpenVulkano spdlog::flush_every(std::chrono::seconds(5)); + setupSignalHandlers(); + MANAGER->info("Logger initialized"); } catch (const spdlog::spdlog_ex& e)