diff --git a/libs/log/source/log.cpp b/libs/log/source/log.cpp index f6043ef1..1c6f5ca5 100644 --- a/libs/log/source/log.cpp +++ b/libs/log/source/log.cpp @@ -26,7 +26,15 @@ namespace psemek::log std::mutex sinks_mutex; std::vector> sinks; - std::pair const signals[] = + using signal_handler = void(*)(int); + + struct signal_data + { + int signal; + std::string message; + }; + + signal_data const signals[] = { {SIGSEGV, "Aborting due to SIGSEGV"}, {SIGABRT, "Aborting due to SIGABRT"}, @@ -38,7 +46,7 @@ namespace psemek::log sinks_flusher() { for (auto const & p : signals) - std::signal(p.first, &handler); + std::signal(p.signal, &handler); } private: @@ -46,16 +54,22 @@ namespace psemek::log { for (auto const & p : signals) { - if (p.first == signal) + if (p.signal == signal) { - put_message(level::error, p.second); + put_message(level::error, p.message); break; } } - for (auto & sink : sinks) - sink->flush(); - std::exit(1); + { + std::lock_guard lock{sinks_mutex}; + for (auto & sink : sinks) + sink->flush(); + sinks.clear(); + } + + std::signal(signal, SIG_DFL); + std::raise(signal); } } flusher; @@ -69,10 +83,9 @@ namespace psemek::log str }; + std::lock_guard lock{sinks_mutex}; for (auto const & sink : sinks) - { sink->put_message(msg); - } } static ::tm safe_localtime(std::time_t const & time)