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