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::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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard lock{sinks_mutex};
|
||||||
for (auto & sink : sinks)
|
for (auto & sink : sinks)
|
||||||
sink->flush();
|
sink->flush();
|
||||||
std::exit(1);
|
sinks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::signal(signal, SIG_DFL);
|
||||||
|
std::raise(signal);
|
||||||
}
|
}
|
||||||
} flusher;
|
} flusher;
|
||||||
|
|
||||||
|
|
@ -69,11 +83,10 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue