Add proper signal & exit handling.

This commit is contained in:
Christoph Heiss 2018-02-27 20:57:26 +01:00
parent 267bfd4378
commit 6c135fa512

View file

@ -13,6 +13,7 @@
#include <cstring>
#include <cstdlib>
#include <csignal>
#include <thread>
#include "clipp.h"
#include "spdlog/spdlog.h"
@ -38,9 +39,6 @@ struct Options {
};
static std::sig_atomic_t shutdown_server;
static Options parse_commandline(int argc, char** argv)
{
Options options;
@ -80,6 +78,9 @@ static Options parse_commandline(int argc, char** argv)
static void clean_up()
{
spdlog::get(LOGGER_NAME)->info("Shutting down.");
spdlog::drop_all();
google::protobuf::ShutdownProtobufLibrary();
}
@ -139,12 +140,19 @@ static void daemonize_process()
static void install_signal_handler()
{
auto action = [](int) {
shutdown_server = true;
};
std::thread{[&]() {
::sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGTERM);
sigaddset(&sigset, SIGINT);
sigprocmask(SIG_BLOCK, &sigset, nullptr);
std::signal(SIGTERM, action);
std::signal(SIGINT, action);
int sig;
sigwait(&sigset, &sig);
clean_up();
std::exit(0);
}}.detach();
}
@ -153,7 +161,6 @@ static void install_signal_handler()
int main(int argc, char* argv[])
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
std::atexit(clean_up);
auto options{parse_commandline(argc, argv)};
auto logger{spdlog::stdout_color_mt(LOGGER_NAME)};
@ -177,12 +184,7 @@ int main(int argc, char* argv[])
for (;;) {
std::this_thread::sleep_for(std::chrono::seconds(1));
if (shutdown_server) {
break;
}
}
logger->info("Shutting down.");
return 0;
}