Valgrind: Split parse() into setIODevice() and start()

Make the API more TaskTree friendly.

Change-Id: I5119e38b5fc3cce234395fc5db5c73cf0c474ac0
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2023-08-08 18:18:25 +02:00
parent 0a320185dc
commit f573af5f69
4 changed files with 20 additions and 7 deletions

View File

@@ -1065,7 +1065,8 @@ void MemcheckToolPrivate::loadXmlLogFile(const QString &filePath)
parser->deleteLater(); parser->deleteLater();
}); });
parser->parse(logFile); // ThreadedParser owns the file parser->setIODevice(logFile);
parser->start();
} }
void MemcheckToolPrivate::parserError(const Error &error) void MemcheckToolPrivate::parserError(const Error &error)

View File

@@ -68,7 +68,8 @@ void ValgrindRunner::Private::xmlSocketConnected()
QTcpSocket *socket = m_xmlServer.nextPendingConnection(); QTcpSocket *socket = m_xmlServer.nextPendingConnection();
QTC_ASSERT(socket, return); QTC_ASSERT(socket, return);
m_xmlServer.close(); m_xmlServer.close();
m_parser.parse(socket); m_parser.setIODevice(socket);
m_parser.start();
} }
void ValgrindRunner::Private::logSocketConnected() void ValgrindRunner::Private::logSocketConnected()

View File

@@ -41,9 +41,17 @@ bool ThreadedParser::isRunning() const
return m_parserThread ? m_parserThread->isRunning() : false; 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_parserThread, return);
QTC_ASSERT(m_device, return);
auto parser = new Parser; auto parser = new Parser;
qRegisterMetaType<Status>(); qRegisterMetaType<Status>();
@@ -54,10 +62,10 @@ void ThreadedParser::parse(QIODevice *device)
m_parserThread = new Thread; m_parserThread = new Thread;
connect(m_parserThread.get(), &QThread::finished, m_parserThread.get(), &QObject::deleteLater); connect(m_parserThread.get(), &QThread::finished, m_parserThread.get(), &QObject::deleteLater);
device->setParent(nullptr); m_device->setParent(nullptr);
device->moveToThread(m_parserThread); m_device->moveToThread(m_parserThread);
parser->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->m_parser = parser;
m_parserThread->start(); m_parserThread->start();
} }

View File

@@ -31,8 +31,10 @@ public:
bool waitForFinished(); bool waitForFinished();
bool isRunning() const; 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 ///@warning will move @p stream to a different thread and take ownership of it
void parse(QIODevice *stream); void start();
signals: signals:
void status(const Status &status); void status(const Status &status);
@@ -40,6 +42,7 @@ signals:
void done(bool success, const QString &errorString); void done(bool success, const QString &errorString);
private: private:
std::unique_ptr<QIODevice> m_device;
QPointer<Thread> m_parserThread; QPointer<Thread> m_parserThread;
}; };