summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@theqtcompany.com>2015-07-20 12:14:16 +0200
committerJoerg Bornemann <joerg.bornemann@theqtcompany.com>2015-07-20 12:14:16 +0200
commit2225ef2dc8912525b54c727cf299f2d53ba96257 (patch)
tree5e3a38f8bdededa7d95b961d0dbfc112bf41ead0 /src
parent54dc938047649bd88e0c829a5ac4bc0fbdd7a006 (diff)
parentbbfd585d9249af3e2c254934a0ee3cca58e4bc86 (diff)
Merge remote-tracking branch 'origin/1.0'
Conflicts: src/app/main.cpp Change-Id: Ia5a756ccc9578aeedd0b7cf9b6dd227d1a085bd2
Diffstat (limited to 'src')
-rw-r--r--src/app/application.cpp7
-rw-r--r--src/app/application.h2
-rw-r--r--src/jomlib/iocompletionport.cpp15
-rw-r--r--src/jomlib/iocompletionport.h8
-rw-r--r--src/jomlib/process.cpp13
5 files changed, 36 insertions, 9 deletions
diff --git a/src/app/application.cpp b/src/app/application.cpp
index f4c6e2e..2cc98aa 100644
--- a/src/app/application.cpp
+++ b/src/app/application.cpp
@@ -19,6 +19,8 @@
****************************************************************************/
#include "application.h"
+#include <iocompletionport.h>
+
#include <QtCore/QDebug>
#include <QtCore/QFileInfo>
#include <QtCore/QSet>
@@ -76,6 +78,11 @@ Application::Application(int &argc, char **argv)
m_bIsSubJOM = NMakeFile::isSubJOM(exeName);
}
+Application::~Application()
+{
+ IoCompletionPort::destroyInstance();
+}
+
void Application::exit(int exitCode)
{
QCoreApplication::exit(exitCode);
diff --git a/src/app/application.h b/src/app/application.h
index 302946e..b8fa181 100644
--- a/src/app/application.h
+++ b/src/app/application.h
@@ -32,6 +32,8 @@ public:
static Application *instance() { return static_cast<Application*>(QCoreApplication::instance()); }
Application(int &argc, char **argv);
+ ~Application();
+
const bool isSubJOM() const { return m_bIsSubJOM; }
public slots:
diff --git a/src/jomlib/iocompletionport.cpp b/src/jomlib/iocompletionport.cpp
index 20616d2..6bbf9d7 100644
--- a/src/jomlib/iocompletionport.cpp
+++ b/src/jomlib/iocompletionport.cpp
@@ -22,6 +22,8 @@
namespace NMakeFile {
+IoCompletionPort *IoCompletionPort::m_instance = 0;
+
IoCompletionPort::IoCompletionPort()
: hPort(INVALID_HANDLE_VALUE)
{
@@ -41,6 +43,19 @@ IoCompletionPort::~IoCompletionPort()
CloseHandle(hPort);
}
+IoCompletionPort *IoCompletionPort::instance()
+{
+ if (!m_instance)
+ m_instance = new IoCompletionPort;
+ return m_instance;
+}
+
+void IoCompletionPort::destroyInstance()
+{
+ delete m_instance;
+ m_instance = 0;
+}
+
void IoCompletionPort::registerObserver(IoCompletionPortObserver *observer, HANDLE hFile)
{
HANDLE hIOCP = CreateIoCompletionPort(hFile, hPort, reinterpret_cast<ULONG_PTR>(observer), 0);
diff --git a/src/jomlib/iocompletionport.h b/src/jomlib/iocompletionport.h
index 42395ae..91d49d0 100644
--- a/src/jomlib/iocompletionport.h
+++ b/src/jomlib/iocompletionport.h
@@ -37,8 +37,8 @@ public:
class IoCompletionPort : protected QThread
{
public:
- IoCompletionPort();
- ~IoCompletionPort();
+ static IoCompletionPort *instance();
+ static void destroyInstance();
void registerObserver(IoCompletionPortObserver *notifier, HANDLE hFile);
void unregisterObserver(IoCompletionPortObserver *notifier);
@@ -47,6 +47,10 @@ protected:
void run();
private:
+ IoCompletionPort();
+ ~IoCompletionPort();
+
+ static IoCompletionPort *m_instance;
HANDLE hPort;
QSet<IoCompletionPortObserver *> observers;
QMutex mutex;
diff --git a/src/jomlib/process.cpp b/src/jomlib/process.cpp
index 5572bc3..41e153c 100644
--- a/src/jomlib/process.cpp
+++ b/src/jomlib/process.cpp
@@ -47,7 +47,6 @@
namespace NMakeFile {
-Q_GLOBAL_STATIC(IoCompletionPort, iocp)
Q_GLOBAL_STATIC(QElapsedTimer, runtime)
struct Pipe
@@ -161,8 +160,8 @@ Process::Process(QObject *parent)
Process::~Process()
{
- iocp()->unregisterObserver(&d->stdoutChannel);
- iocp()->unregisterObserver(&d->stderrChannel);
+ IoCompletionPort::instance()->unregisterObserver(&d->stdoutChannel);
+ IoCompletionPort::instance()->unregisterObserver(&d->stderrChannel);
if (m_state == Running)
qWarning("Process: destroyed while process still running.");
@@ -362,8 +361,8 @@ void Process::start(const QString &commandLine)
if (!setupPipe(d->stderrPipe, &sa, OutputPipe))
qFatal("Cannot setup pipe for stderr.");
- iocp()->registerObserver(&d->stdoutChannel, d->stdoutPipe.hRead);
- iocp()->registerObserver(&d->stderrChannel, d->stderrPipe.hRead);
+ IoCompletionPort::instance()->registerObserver(&d->stdoutChannel, d->stdoutPipe.hRead);
+ IoCompletionPort::instance()->registerObserver(&d->stderrChannel, d->stderrPipe.hRead);
if (!d->startRead()) {
m_state = NotRunning;
emit error(FailedToStart);
@@ -429,8 +428,8 @@ void Process::onProcessFinished()
return;
d->deathNotifier.setEnabled(false);
- iocp()->unregisterObserver(&d->stdoutChannel);
- iocp()->unregisterObserver(&d->stderrChannel);
+ IoCompletionPort::instance()->unregisterObserver(&d->stdoutChannel);
+ IoCompletionPort::instance()->unregisterObserver(&d->stderrChannel);
safelyCloseHandle(d->stdoutPipe.hRead);
safelyCloseHandle(d->stderrPipe.hRead);
safelyCloseHandle(d->hProcess);