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::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"},
{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;
}
}
{
std::lock_guard lock{sinks_mutex};
for (auto & sink : sinks)
sink->flush();
std::exit(1);
sinks.clear();
}
std::signal(signal, SIG_DFL);
std::raise(signal);
}
} flusher;
@ -69,11 +83,10 @@ 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)
{