~singpolyma/biboumi

6a28bde1dd21809b3c1202aab0b695b11f4d4846 — Florent Le Coz 9 years ago 0d70674
Reset the signal handlers when SIGINT or SIGTERM is received

To avoid doing a double exit when receiving bot SIGINT and SIGTERM
1 files changed, 12 insertions(+), 0 deletions(-)

M src/main.cpp
M src/main.cpp => src/main.cpp +12 -0
@@ 40,6 40,18 @@ int config_help(const std::string& missing_option)

static void sigint_handler(int sig, siginfo_t*, void*)
{
  // We reset the SIGTERM or SIGINT (the one that didn't trigger this
  // handler) signal handler to its default value.  This avoid calling this
  // handler twice, if the process receive both signals in a quick
  // succession.
  int sig_to_reset = (sig == SIGINT? SIGTERM: SIGINT);
  sigset_t mask;
  sigemptyset(&mask);
  struct sigaction sigreset = {};
  sigreset.sa_handler = SIG_DFL;
  sigreset.sa_mask = mask;
  sigaction(sig_to_reset, &sigreset, nullptr);

  // In 2 seconds, repeat the same signal, to force the exit
  TimedEventsManager::instance().add_event(TimedEvent(std::chrono::steady_clock::now() + 2s,
                                    [sig]() { raise(sig); }));