Delete parsers after parsing is done.

This way we have a chance to flush out any state the parsers
might have.
This commit is contained in:
Tobias Hunger
2010-09-02 16:42:19 +02:00
parent 081e31fc8c
commit 2c24bee040
5 changed files with 32 additions and 2 deletions

View File

@@ -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)),

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);