summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKari Oikarinen <kari.oikarinen@qt.io>2018-09-05 16:29:13 +0300
committerKari Oikarinen <kari.oikarinen@qt.io>2018-09-11 06:11:01 +0000
commit0412faf51df1dd15dd79ae7d2ecd0a053768c9fa (patch)
tree0b8eea9d4ed8b3a287debc8f3a70cd090d1d2005
parentca443d6c09ba698c7d69348f7571079399ca8c7e (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.h2
-rw-r--r--libqdb/interruptsignalhandler_unix.cpp16
-rw-r--r--libqdb/interruptsignalhandler_win.cpp4
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);