From 2c24bee040d934defd3f2fa0f3b888c8463c9d12 Mon Sep 17 00:00:00 2001 From: Tobias Hunger <tobias.hunger@nokia.com> Date: Thu, 2 Sep 2010 16:42:19 +0200 Subject: [PATCH] Delete parsers after parsing is done. This way we have a chance to flush out any state the parsers might have. --- src/plugins/projectexplorer/abstractprocessstep.cpp | 6 ++++++ src/plugins/projectexplorer/ioutputparser.cpp | 11 +++++++++-- src/plugins/projectexplorer/ioutputparser.h | 1 + src/plugins/projectexplorer/outputparser_test.cpp | 13 +++++++++++++ src/plugins/projectexplorer/outputparser_test.h | 3 +++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index fcde4a2a463..2a42a58fd30 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -204,6 +204,12 @@ void AbstractProcessStep::processStarted() void AbstractProcessStep::processFinished(int exitCode, QProcess::ExitStatus status) { + // Clean up output parsers + if (m_outputParserChain) { + delete m_outputParserChain; + m_outputParserChain = 0; + } + if (status == QProcess::NormalExit && exitCode == 0) { emit addOutput(tr("The process \"%1\" exited normally.") .arg(QDir::toNativeSeparators(m_command)), diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index 25020291709..4bd15206071 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -60,9 +60,9 @@ IOutputParser *IOutputParser::takeOutputParserChain() { IOutputParser *parser = m_parser; disconnect(parser, SIGNAL(addOutput(QString,ProjectExplorer::BuildStep::OutputFormat)), - this, SLOT(outputAdded(QString,ProjectExplorer::BuildStep::OutputFormat))); + this, SLOT(outputAdded(QString,ProjectExplorer::BuildStep::OutputFormat))); disconnect(parser, SIGNAL(addTask(ProjectExplorer::Task)), - this, SLOT(taskAdded(ProjectExplorer::Task))); + this, SLOT(taskAdded(ProjectExplorer::Task))); m_parser = 0; return parser; } @@ -72,6 +72,13 @@ IOutputParser *IOutputParser::childParser() const return m_parser; } +void IOutputParser::setChildParser(IOutputParser *parser) +{ + if (m_parser != parser) + delete m_parser; + m_parser = parser; +} + void IOutputParser::stdOutput(const QString &line) { if (m_parser) diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h index ba8dfbb47e5..37da95b6ce6 100644 --- a/src/plugins/projectexplorer/ioutputparser.h +++ b/src/plugins/projectexplorer/ioutputparser.h @@ -57,6 +57,7 @@ public: /// Return the head of this parsers output parser children /// IOutputParser keeps ownership! IOutputParser *childParser() const; + void setChildParser(IOutputParser *parser); /// Called once for each line if standard output to parse. virtual void stdOutput(const QString &line); diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index e1ea1a61f12..ab3b714ec82 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -64,6 +64,19 @@ void OutputParserTester::testParsing(const QString &lines, else childParser()->stdError(input); } + // first disconnect ourselves from the end of the parser chain again + IOutputParser * parser = this; + while (parser = parser->childParser()) { + if (parser->childParser() == this) { + childParser()->takeOutputParserChain(); + break; + } + } + parser = 0; + emit aboutToDeleteParser(); + + // then delete the parser(s) to test + setChildParser(0); QCOMPARE(m_receivedOutput, outputLines); QCOMPARE(m_receivedStdErrChildLine, childStdErrLines); diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h index 5d3a4d2d0b1..74fe5c87a63 100644 --- a/src/plugins/projectexplorer/outputparser_test.h +++ b/src/plugins/projectexplorer/outputparser_test.h @@ -70,6 +70,9 @@ public: void appendOutputParser(IOutputParser *parser); +signals: + void aboutToDeleteParser(); + private slots: void outputAdded(const QString &line, const QTextCharFormat &textCharFormat); void taskAdded(const ProjectExplorer::Task &task); -- GitLab