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:
parent
4fd7d31e09
commit
9e32306dae
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user