QTestLib: fix race on QElapsedTimers from WatchDog thread

The WatchDog thread calls printTestRunTime() which reads the two
timers, created and started in the main thread.

Pick-to: 6.9 6.8 6.5
Change-Id: I1a337648fddf87190075b7902311544d0ab21ac3
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
David Faure 2025-03-29 09:36:36 +01:00
parent 4fd7d31e09
commit 9e32306dae

View File

@ -69,6 +69,7 @@ static void saveCoverageTool(const char * appname, bool testfailed, bool install
#endif
}
Q_CONSTINIT static QBasicMutex elapsedTimersMutex; // due to the WatchDog thread
Q_CONSTINIT static QElapsedTimer elapsedFunctionTime;
Q_CONSTINIT static QElapsedTimer elapsedTotalTime;
@ -320,7 +321,10 @@ namespace QTest {
void QTestLog::enterTestFunction(const char* function)
{
elapsedFunctionTime.start();
{
QMutexLocker locker(&elapsedTimersMutex);
elapsedFunctionTime.start();
}
if (printAvailableTags)
return;
@ -548,8 +552,11 @@ void QTestLog::addBenchmarkResults(const QList<QBenchmarkResult> &results)
void QTestLog::startLogging()
{
elapsedTotalTime.start();
elapsedFunctionTime.start();
{
QMutexLocker locker(&elapsedTimersMutex);
elapsedTotalTime.start();
elapsedFunctionTime.start();
}
for (auto &logger : QTest::loggers->allLoggers())
logger->startLogging();
QTest::oldMessageHandler = qInstallMessageHandler(QTest::messageHandler);
@ -767,11 +774,13 @@ bool QTestLog::installedTestCoverage()
qint64 QTestLog::nsecsTotalTime()
{
QMutexLocker locker(&elapsedTimersMutex);
return elapsedTotalTime.nsecsElapsed();
}
qint64 QTestLog::nsecsFunctionTime()
{
QMutexLocker locker(&elapsedTimersMutex);
return elapsedFunctionTime.nsecsElapsed();
}