From ab882795777eb3e2b8835f95979b7422ece2dbd5 Mon Sep 17 00:00:00 2001 From: Pavel Kartavyy Date: Fri, 10 Jun 2016 15:01:03 +0300 Subject: [PATCH] BaseDaemon: terminate on double SIGINT --- libs/libdaemon/include/daemon/BaseDaemon.h | 3 ++- libs/libdaemon/src/BaseDaemon.cpp | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/libs/libdaemon/include/daemon/BaseDaemon.h b/libs/libdaemon/include/daemon/BaseDaemon.h index 6a5ba88e2a..0f9d7363a0 100644 --- a/libs/libdaemon/include/daemon/BaseDaemon.h +++ b/libs/libdaemon/include/daemon/BaseDaemon.h @@ -191,5 +191,6 @@ protected: std::mutex signal_handler_mutex; std::condition_variable signal_event; - size_t terminate_signals_counter = 0; + std::atomic_size_t terminate_signals_counter{0}; + std::atomic_size_t sigint_signals_counter{0}; }; diff --git a/libs/libdaemon/src/BaseDaemon.cpp b/libs/libdaemon/src/BaseDaemon.cpp index dc2b1f39ae..69e940dd4e 100644 --- a/libs/libdaemon/src/BaseDaemon.cpp +++ b/libs/libdaemon/src/BaseDaemon.cpp @@ -909,6 +909,7 @@ void BaseDaemon::handleSignal(int signal_id) std::unique_lock lock(signal_handler_mutex); { ++terminate_signals_counter; + sigint_signals_counter += signal_id == SIGINT; signal_event.notify_all(); } @@ -921,9 +922,13 @@ void BaseDaemon::handleSignal(int signal_id) void BaseDaemon::onInterruptSignals(int signal_id) { is_cancelled = true; - LOG_INFO(&logger(), - "Received termination signal (" << strsignal(signal_id) << ")." - " Terminate is requested " << terminate_signals_counter << " times."); + LOG_INFO(&logger(), "Received termination signal (" << strsignal(signal_id) << ")"); + + if (sigint_signals_counter >= 2) + { + LOG_INFO(&logger(), "Received second signal Interrupt. Immediately terminate."); + kill(); + } } -- GitLab