diff --git a/libs/libdaemon/include/daemon/BaseDaemon.h b/libs/libdaemon/include/daemon/BaseDaemon.h index 6a5ba88e2ad311235a165ef776e89e0e8665a668..0f9d7363a0dd6b8ae5d2682291ae90253de15416 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 dc2b1f39ae5ee9dde5e4050211694e3277d204d3..69e940dd4ecdd2e6050bf89896155189872d3445 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(); + } }