Logging small signal handling refactor & concurrency fixes

This commit is contained in:
Nikita Lisitsa 2023-08-05 12:46:21 +03:00
parent 95e99e4104
commit d13c097d61

View file

@ -26,7 +26,15 @@ namespace psemek::log
std::mutex sinks_mutex; std::mutex sinks_mutex;
std::vector<std::unique_ptr<sink>> sinks; std::vector<std::unique_ptr<sink>> sinks;
std::pair<int, std::string> const signals[] = using signal_handler = void(*)(int);
struct signal_data
{
int signal;
std::string message;
};
signal_data const signals[] =
{ {
{SIGSEGV, "Aborting due to SIGSEGV"}, {SIGSEGV, "Aborting due to SIGSEGV"},
{SIGABRT, "Aborting due to SIGABRT"}, {SIGABRT, "Aborting due to SIGABRT"},
@ -38,7 +46,7 @@ namespace psemek::log
sinks_flusher() sinks_flusher()
{ {
for (auto const & p : signals) for (auto const & p : signals)
std::signal(p.first, &handler); std::signal(p.signal, &handler);
} }
private: private:
@ -46,16 +54,22 @@ namespace psemek::log
{ {
for (auto const & p : signals) 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; break;
} }
} }
for (auto & sink : sinks) {
sink->flush(); std::lock_guard lock{sinks_mutex};
std::exit(1); for (auto & sink : sinks)
sink->flush();
sinks.clear();
}
std::signal(signal, SIG_DFL);
std::raise(signal);
} }
} flusher; } flusher;
@ -69,10 +83,9 @@ namespace psemek::log
str str
}; };
std::lock_guard lock{sinks_mutex};
for (auto const & sink : sinks) for (auto const & sink : sinks)
{
sink->put_message(msg); sink->put_message(msg);
}
} }
static ::tm safe_localtime(std::time_t const & time) static ::tm safe_localtime(std::time_t const & time)