aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2012-11-23 14:47:08 +0100
committerChristian Kandeler <christian.kandeler@digia.com>2012-11-23 16:14:42 +0100
commit425a82d4121761ff7233111f3f8495e292779535 (patch)
tree14698f3f64b8638f05218df90950ba3555dabada
parent58d15d572b465e9a571213a8f0504ffb90976b1c (diff)
call Application::userInterrupt() directly from signal handler
Sending a signal will leave the interrupt request unhandled until we get in the application's event loop. Change-Id: I6e9d34ad8574c59d6b26e879e56fc0cb76b34141 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
-rw-r--r--src/app/qbs/application.cpp7
-rw-r--r--src/app/qbs/application.h4
-rw-r--r--src/app/qbs/ctrlchandler.cpp16
3 files changed, 17 insertions, 10 deletions
diff --git a/src/app/qbs/application.cpp b/src/app/qbs/application.cpp
index c12b78027..c91f95d9f 100644
--- a/src/app/qbs/application.cpp
+++ b/src/app/qbs/application.cpp
@@ -31,7 +31,6 @@
#include "consoleprogressobserver.h"
#include "ctrlchandler.h"
-
#include <logging/logger.h>
#include <logging/translator.h>
@@ -55,8 +54,14 @@ void Application::init()
setOrganizationDomain(QLatin1String("qt-project.org"));
}
+/**
+ * Interrupt the application. This is directly called from a signal handler.
+ */
void Application::userInterrupt()
{
+ if (!m_observer)
+ return;
+
qbsInfo() << Tr::tr("Received termination request from user; canceling build. [pid=%1]")
.arg(applicationPid());
m_observer->setCanceled(true);
diff --git a/src/app/qbs/application.h b/src/app/qbs/application.h
index 347e404e7..19a617599 100644
--- a/src/app/qbs/application.h
+++ b/src/app/qbs/application.h
@@ -44,10 +44,8 @@ public:
static Application *instance();
void init();
- ConsoleProgressObserver *observer() const { return m_observer; }
-
-public slots:
void userInterrupt();
+ ConsoleProgressObserver *observer() const { return m_observer; }
private:
ConsoleProgressObserver * const m_observer;
diff --git a/src/app/qbs/ctrlchandler.cpp b/src/app/qbs/ctrlchandler.cpp
index cf496af6b..addb46a6c 100644
--- a/src/app/qbs/ctrlchandler.cpp
+++ b/src/app/qbs/ctrlchandler.cpp
@@ -27,10 +27,14 @@
**
****************************************************************************/
-#include <QtGlobal>
-#include <QCoreApplication>
-#include <QDebug>
-#include <QTimer>
+#include "application.h"
+
+static void cancel()
+{
+ qbs::Application * const app = qbs::Application::instance();
+ if (app)
+ app->userInterrupt();
+}
#if defined(Q_OS_WIN) && defined(Q_CC_MSVC)
@@ -39,7 +43,7 @@
static BOOL WINAPI consoleCtrlHandlerRoutine(__in DWORD dwCtrlType)
{
Q_UNUSED(dwCtrlType);
- QTimer::singleShot(0, qApp, SLOT(userInterrupt()));
+ cancel();
return TRUE;
}
@@ -55,7 +59,7 @@ void installCtrlCHandler()
static void sigIntHandler(int sig)
{
Q_UNUSED(sig);
- QTimer::singleShot(0, qApp, SLOT(userInterrupt()));
+ cancel();
}
void installCtrlCHandler()