summaryrefslogtreecommitdiff
path: root/src/plugins/projectexplorer/abstractprocessstep.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/projectexplorer/abstractprocessstep.cpp')
-rw-r--r--src/plugins/projectexplorer/abstractprocessstep.cpp50
1 files changed, 27 insertions, 23 deletions
diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp
index 95d8729018..2aaf5b6931 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.cpp
+++ b/src/plugins/projectexplorer/abstractprocessstep.cpp
@@ -91,7 +91,7 @@ using namespace ProjectExplorer;
AbstractProcessStep::AbstractProcessStep(BuildStepList *bsl, const Core::Id id) :
BuildStep(bsl, id), m_timer(0), m_futureInterface(0),
m_ignoreReturnValue(false), m_process(0),
- m_eventLoop(0), m_outputParserChain(0)
+ m_outputParserChain(0)
{
}
@@ -99,7 +99,7 @@ AbstractProcessStep::AbstractProcessStep(BuildStepList *bsl,
AbstractProcessStep *bs) :
BuildStep(bsl, bs), m_timer(0), m_futureInterface(0),
m_ignoreReturnValue(bs->m_ignoreReturnValue),
- m_process(0), m_eventLoop(0), m_outputParserChain(0)
+ m_process(0), m_outputParserChain(0)
{
}
@@ -197,15 +197,12 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi)
m_process->setEnvironment(m_param.environment());
connect(m_process, SIGNAL(readyReadStandardOutput()),
- this, SLOT(processReadyReadStdOutput()),
- Qt::DirectConnection);
+ this, SLOT(processReadyReadStdOutput()));
connect(m_process, SIGNAL(readyReadStandardError()),
- this, SLOT(processReadyReadStdError()),
- Qt::DirectConnection);
+ this, SLOT(processReadyReadStdError()));
connect(m_process, SIGNAL(finished(int,QProcess::ExitStatus)),
- this, SLOT(slotProcessFinished(int,QProcess::ExitStatus)),
- Qt::DirectConnection);
+ this, SLOT(slotProcessFinished(int,QProcess::ExitStatus)));
m_process->setCommand(m_param.effectiveCommand(), m_param.effectiveArguments());
m_process->start();
@@ -214,19 +211,19 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi)
delete m_process;
m_process = 0;
fi.reportResult(false);
+ emit finished();
return;
}
processStarted();
m_timer = new QTimer();
- connect(m_timer, SIGNAL(timeout()), this, SLOT(checkForCancel()), Qt::DirectConnection);
+ connect(m_timer, SIGNAL(timeout()), this, SLOT(checkForCancel()));
m_timer->start(500);
- m_eventLoop = new QEventLoop;
- m_eventLoop->exec();
- m_timer->stop();
- delete m_timer;
- m_timer = 0;
+ m_killProcess = false;
+}
+void AbstractProcessStep::cleanUp()
+{
// The process has finished, leftover data is read in processFinished
processFinished(m_process->exitCode(), m_process->exitStatus());
bool returnValue = processSucceeded(m_process->exitCode(), m_process->exitStatus()) || m_ignoreReturnValue;
@@ -239,11 +236,10 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi)
delete m_process;
m_process = 0;
- delete m_eventLoop;
- m_eventLoop = 0;
- fi.reportResult(returnValue);
+ m_futureInterface->reportResult(returnValue);
m_futureInterface = 0;
- return;
+
+ emit finished();
}
/*!
@@ -351,10 +347,14 @@ void AbstractProcessStep::stdError(const QString &line)
void AbstractProcessStep::checkForCancel()
{
if (m_futureInterface->isCanceled() && m_timer->isActive()) {
- m_timer->stop();
- m_process->terminate();
- m_process->waitForFinished(5000);
- m_process->kill();
+ if (!m_killProcess) {
+ m_process->terminate();
+ m_timer->start(5000);
+ m_killProcess = true;
+ } else {
+ m_process->kill();
+ m_timer->stop();
+ }
}
}
@@ -413,6 +413,10 @@ void AbstractProcessStep::outputAdded(const QString &string, ProjectExplorer::Bu
void AbstractProcessStep::slotProcessFinished(int, QProcess::ExitStatus)
{
+ m_timer->stop();
+ delete m_timer;
+ m_timer = 0;
+
QString line = QString::fromLocal8Bit(m_process->readAllStandardError());
if (!line.isEmpty())
stdError(line);
@@ -421,5 +425,5 @@ void AbstractProcessStep::slotProcessFinished(int, QProcess::ExitStatus)
if (!line.isEmpty())
stdOutput(line);
- m_eventLoop->exit(0);
+ cleanUp();
}