diff options
author | Kari Oikarinen <kari.oikarinen@qt.io> | 2018-09-05 16:29:13 +0300 |
---|---|---|
committer | Kari Oikarinen <kari.oikarinen@qt.io> | 2018-09-11 06:11:01 +0000 |
commit | 0412faf51df1dd15dd79ae7d2ecd0a053768c9fa (patch) | |
tree | 0b8eea9d4ed8b3a287debc8f3a70cd090d1d2005 | |
parent | ca443d6c09ba698c7d69348f7571079399ca8c7e (diff) |
Handle both SIGINT and SIGTERM on unix
Handling SIGTERM allows graceful shutdown when stopped by init script.
Task-number: QTBUG-63029
Change-Id: Iac96666895a2a9bf256c6eb7abb528f65a198133
Reviewed-by: Sami Nurmenniemi <sami.nurmenniemi@qt.io>
Reviewed-by: Samuli Piippo <samuli.piippo@qt.io>
-rw-r--r-- | libqdb/interruptsignalhandler.h | 2 | ||||
-rw-r--r-- | libqdb/interruptsignalhandler_unix.cpp | 16 | ||||
-rw-r--r-- | libqdb/interruptsignalhandler_win.cpp | 4 |
3 files changed, 13 insertions, 9 deletions
diff --git a/libqdb/interruptsignalhandler.h b/libqdb/interruptsignalhandler.h index da28308..30f56a3 100644 --- a/libqdb/interruptsignalhandler.h +++ b/libqdb/interruptsignalhandler.h @@ -44,7 +44,7 @@ signals: void interrupted(); private: - bool installSigIntHandler(); + bool installSignalHandler(); InterruptSignalHandlerPrivate* d; }; diff --git a/libqdb/interruptsignalhandler_unix.cpp b/libqdb/interruptsignalhandler_unix.cpp index 913d6d9..4fbfff9 100644 --- a/libqdb/interruptsignalhandler_unix.cpp +++ b/libqdb/interruptsignalhandler_unix.cpp @@ -50,7 +50,8 @@ public slots: public: static int s_socketPair[2]; - struct sigaction oldAction; + struct sigaction oldIntAction; + struct sigaction oldTermAction; std::unique_ptr<QSocketNotifier> socketNotifier = nullptr; private: @@ -68,7 +69,7 @@ InterruptSignalHandler::InterruptSignalHandler(QObject *parent) d->socketNotifier = make_unique<QSocketNotifier>(d->s_socketPair[1], QSocketNotifier::Read); connect(d->socketNotifier.get(), &QSocketNotifier::activated, d, &InterruptSignalHandlerPrivate::handleSigInt); - if (!installSigIntHandler()) + if (!installSignalHandler()) qFatal("Could not install signal handler in InterruptSignalHandler"); } @@ -77,7 +78,7 @@ InterruptSignalHandler::~InterruptSignalHandler() delete d; } -bool InterruptSignalHandler::installSigIntHandler() +bool InterruptSignalHandler::installSignalHandler() { struct sigaction action; action.sa_handler = &InterruptSignalHandlerPrivate::sigIntHandler; @@ -85,7 +86,9 @@ bool InterruptSignalHandler::installSigIntHandler() action.sa_flags = 0; action.sa_flags |= SA_RESTART; - if (sigaction(SIGINT, &action, &d->oldAction)) + if (sigaction(SIGINT, &action, &d->oldIntAction)) + return false; + if (sigaction(SIGTERM, &action, &d->oldTermAction)) return false; return true; @@ -110,8 +113,9 @@ void InterruptSignalHandlerPrivate::handleSigInt() char tmp; read(s_socketPair[1], &tmp, sizeof(tmp)); - // Reset signal action to allow a second Control-C to interrupt hanging qdb - sigaction(SIGINT, &oldAction, nullptr); + // Reset signal actions to allow further signals to interrupt hanging qdb + sigaction(SIGINT, &oldIntAction, nullptr); + sigaction(SIGTERM, &oldTermAction, nullptr); emit q->interrupted(); } diff --git a/libqdb/interruptsignalhandler_win.cpp b/libqdb/interruptsignalhandler_win.cpp index 5ab4323..a664ed0 100644 --- a/libqdb/interruptsignalhandler_win.cpp +++ b/libqdb/interruptsignalhandler_win.cpp @@ -42,7 +42,7 @@ InterruptSignalHandler* InterruptSignalHandlerPrivate::s_handler = nullptr; InterruptSignalHandler::InterruptSignalHandler(QObject *parent) : QObject(parent) { - if (!installSigIntHandler()) + if (!installSignalHandler()) qFatal("Could not install signal handler in InterruptSignalHandler"); } @@ -51,7 +51,7 @@ InterruptSignalHandler::~InterruptSignalHandler() SetConsoleCtrlHandler(&InterruptSignalHandlerPrivate::consoleHandler, FALSE); } -bool InterruptSignalHandler::installSigIntHandler() +bool InterruptSignalHandler::installSignalHandler() { d->s_handler = this; return SetConsoleCtrlHandler(&InterruptSignalHandlerPrivate::consoleHandler, TRUE); |