diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp
index 4a353f7e908..89cf1b0351b 100644
--- a/src/plugins/valgrind/memchecktool.cpp
+++ b/src/plugins/valgrind/memchecktool.cpp
@@ -1058,12 +1058,12 @@ void MemcheckToolPrivate::loadXmlLogFile(const QString &filePath)
auto parser = new ThreadedParser;
connect(parser, &ThreadedParser::error,
this, &MemcheckToolPrivate::parserError);
- connect(parser, &ThreadedParser::internalError,
- this, &MemcheckToolPrivate::internalParserError);
- connect(parser, &ThreadedParser::finished,
- this, &MemcheckToolPrivate::loadingExternalXmlLogFileFinished);
- connect(parser, &ThreadedParser::finished,
- parser, &ThreadedParser::deleteLater);
+ connect(parser, &ThreadedParser::done, this, [this, parser](bool success, const QString &err) {
+ if (!success)
+ internalParserError(err);
+ loadingExternalXmlLogFileFinished();
+ parser->deleteLater();
+ });
parser->parse(logFile); // ThreadedParser owns the file
}
diff --git a/src/plugins/valgrind/valgrindrunner.cpp b/src/plugins/valgrind/valgrindrunner.cpp
index 804167b7bce..bfbf168faae 100644
--- a/src/plugins/valgrind/valgrindrunner.cpp
+++ b/src/plugins/valgrind/valgrindrunner.cpp
@@ -162,7 +162,10 @@ ValgrindRunner::ValgrindRunner(QObject *parent)
{
connect(&d->m_parser, &ThreadedParser::status, this, &ValgrindRunner::status);
connect(&d->m_parser, &ThreadedParser::error, this, &ValgrindRunner::error);
- connect(&d->m_parser, &ThreadedParser::internalError, this, &ValgrindRunner::internalError);
+ connect(&d->m_parser, &ThreadedParser::done, this, [this](bool success, const QString &err) {
+ if (!success)
+ emit internalError(err);
+ });
}
ValgrindRunner::~ValgrindRunner()
diff --git a/src/plugins/valgrind/xmlprotocol/parser.cpp b/src/plugins/valgrind/xmlprotocol/parser.cpp
index b3e6a41c0b9..790a383d69c 100644
--- a/src/plugins/valgrind/xmlprotocol/parser.cpp
+++ b/src/plugins/valgrind/xmlprotocol/parser.cpp
@@ -318,12 +318,6 @@ static Status::State parseState(const QString &state)
throw ParserException(Tr::tr("Unknown state \"%1\"").arg(state));
}
-void Parser::Private::reportInternalError(const QString &e)
-{
- errorString = e;
- emit q->internalError(e);
-}
-
static Stack makeStack(const XauxWhat &xauxwhat, const QList &frames)
{
Stack s;
@@ -618,7 +612,9 @@ void Parser::Private::parse(QIODevice *device)
{
QTC_ASSERT(device, return);
reader.setDevice(device);
+ errorString.clear();
+ bool success = true;
try {
while (notAtEnd()) {
blockingReadNext();
@@ -639,11 +635,13 @@ void Parser::Private::parse(QIODevice *device)
checkTool(blockingReadElementText());
}
} catch (const ParserException &e) {
- reportInternalError(e.message());
+ errorString = e.message();
+ success = false;
} catch (...) {
- reportInternalError(Tr::tr("Unexpected exception caught during parsing."));
+ errorString = Tr::tr("Unexpected exception caught during parsing.");
+ success = false;
}
- emit q->finished();
+ emit q->done(success, errorString);
}
Parser::Parser(QObject *parent)
diff --git a/src/plugins/valgrind/xmlprotocol/parser.h b/src/plugins/valgrind/xmlprotocol/parser.h
index 069696cba64..b38d9058953 100644
--- a/src/plugins/valgrind/xmlprotocol/parser.h
+++ b/src/plugins/valgrind/xmlprotocol/parser.h
@@ -33,11 +33,10 @@ public:
signals:
void status(const Valgrind::XmlProtocol::Status &status);
void error(const Valgrind::XmlProtocol::Error &error);
- void internalError(const QString &errorString);
void errorCount(qint64 unique, qint64 count);
void suppressionCount(const QString &name, qint64 count);
void announceThread(const Valgrind::XmlProtocol::AnnounceThread &announceThread);
- void finished();
+ void done(bool success, const QString &errorString);
private:
class Private;
diff --git a/src/plugins/valgrind/xmlprotocol/threadedparser.cpp b/src/plugins/valgrind/xmlprotocol/threadedparser.cpp
index d7385e60943..af38da7bcfe 100644
--- a/src/plugins/valgrind/xmlprotocol/threadedparser.cpp
+++ b/src/plugins/valgrind/xmlprotocol/threadedparser.cpp
@@ -50,9 +50,7 @@ void ThreadedParser::parse(QIODevice *device)
qRegisterMetaType();
connect(parser, &Parser::status, this, &ThreadedParser::status, Qt::QueuedConnection);
connect(parser, &Parser::error, this, &ThreadedParser::error, Qt::QueuedConnection);
- connect(parser, &Parser::internalError, this, &ThreadedParser::internalError,
- Qt::QueuedConnection);
- connect(parser, &Parser::finished, this, &ThreadedParser::finished, Qt::QueuedConnection);
+ connect(parser, &Parser::done, this, &ThreadedParser::done, Qt::QueuedConnection);
m_parserThread = new Thread;
connect(m_parserThread.get(), &QThread::finished, m_parserThread.get(), &QObject::deleteLater);
diff --git a/src/plugins/valgrind/xmlprotocol/threadedparser.h b/src/plugins/valgrind/xmlprotocol/threadedparser.h
index c88abf3fe68..8def97f00c5 100644
--- a/src/plugins/valgrind/xmlprotocol/threadedparser.h
+++ b/src/plugins/valgrind/xmlprotocol/threadedparser.h
@@ -37,8 +37,7 @@ public:
signals:
void status(const Status &status);
void error(const Error &error);
- void internalError(const QString &errorString);
- void finished();
+ void done(bool success, const QString &errorString);
private:
QPointer m_parserThread;