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->parse(logFile); // ThreadedParser owns the file
parser->setIODevice(logFile);
parser->start();
}
void MemcheckToolPrivate::parserError(const Error &error)

View File

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

View File

@@ -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<Status>();
@@ -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();
}

View File

@@ -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<QIODevice> m_device;
QPointer<Thread> m_parserThread;
};