From f573af5f69a05159ae3a20f05c487e76488494e9 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 8 Aug 2023 18:18:25 +0200 Subject: [PATCH] Valgrind: Split parse() into setIODevice() and start() Make the API more TaskTree friendly. Change-Id: I5119e38b5fc3cce234395fc5db5c73cf0c474ac0 Reviewed-by: hjk --- src/plugins/valgrind/memchecktool.cpp | 3 ++- src/plugins/valgrind/valgrindrunner.cpp | 3 ++- .../valgrind/xmlprotocol/threadedparser.cpp | 16 ++++++++++++---- .../valgrind/xmlprotocol/threadedparser.h | 5 ++++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index 89cf1b0351b..92de06ed6a3 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -1065,7 +1065,8 @@ void MemcheckToolPrivate::loadXmlLogFile(const QString &filePath) parser->deleteLater(); }); - parser->parse(logFile); // ThreadedParser owns the file + parser->setIODevice(logFile); + parser->start(); } void MemcheckToolPrivate::parserError(const Error &error) diff --git a/src/plugins/valgrind/valgrindrunner.cpp b/src/plugins/valgrind/valgrindrunner.cpp index bfbf168faae..196fba7d7b0 100644 --- a/src/plugins/valgrind/valgrindrunner.cpp +++ b/src/plugins/valgrind/valgrindrunner.cpp @@ -68,7 +68,8 @@ void ValgrindRunner::Private::xmlSocketConnected() QTcpSocket *socket = m_xmlServer.nextPendingConnection(); QTC_ASSERT(socket, return); m_xmlServer.close(); - m_parser.parse(socket); + m_parser.setIODevice(socket); + m_parser.start(); } void ValgrindRunner::Private::logSocketConnected() diff --git a/src/plugins/valgrind/xmlprotocol/threadedparser.cpp b/src/plugins/valgrind/xmlprotocol/threadedparser.cpp index af38da7bcfe..561535a6292 100644 --- a/src/plugins/valgrind/xmlprotocol/threadedparser.cpp +++ b/src/plugins/valgrind/xmlprotocol/threadedparser.cpp @@ -41,9 +41,17 @@ bool ThreadedParser::isRunning() const return m_parserThread ? m_parserThread->isRunning() : false; } -void ThreadedParser::parse(QIODevice *device) +void ThreadedParser::setIODevice(QIODevice *device) +{ + QTC_ASSERT(device, return); + QTC_ASSERT(device->isOpen(), return); + m_device.reset(device); +} + +void ThreadedParser::start() { QTC_ASSERT(!m_parserThread, return); + QTC_ASSERT(m_device, return); auto parser = new Parser; qRegisterMetaType(); @@ -54,10 +62,10 @@ void ThreadedParser::parse(QIODevice *device) m_parserThread = new Thread; connect(m_parserThread.get(), &QThread::finished, m_parserThread.get(), &QObject::deleteLater); - device->setParent(nullptr); - device->moveToThread(m_parserThread); + m_device->setParent(nullptr); + m_device->moveToThread(m_parserThread); parser->moveToThread(m_parserThread); - m_parserThread->m_device = device; + m_parserThread->m_device = m_device.release(); m_parserThread->m_parser = parser; m_parserThread->start(); } diff --git a/src/plugins/valgrind/xmlprotocol/threadedparser.h b/src/plugins/valgrind/xmlprotocol/threadedparser.h index 8def97f00c5..51d3fb4cfd8 100644 --- a/src/plugins/valgrind/xmlprotocol/threadedparser.h +++ b/src/plugins/valgrind/xmlprotocol/threadedparser.h @@ -31,8 +31,10 @@ public: bool waitForFinished(); bool isRunning() const; + // The passed device needs to be open. The parser takes ownership of the passed device. + void setIODevice(QIODevice *device); ///@warning will move @p stream to a different thread and take ownership of it - void parse(QIODevice *stream); + void start(); signals: void status(const Status &status); @@ -40,6 +42,7 @@ signals: void done(bool success, const QString &errorString); private: + std::unique_ptr m_device; QPointer m_parserThread; };