Logging small signal handling refactor & concurrency fixes
This commit is contained in:
parent
95e99e4104
commit
d13c097d61
1 changed files with 22 additions and 9 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue