summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-01 09:56:16 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-01 12:15:22 +0200
commitfe36d47b371b71ad5fec30d4b5d7bf0baa0205ea (patch)
tree899fd0a5f4a6cf33a8a538aeb6ac4f6a0fd5362f /src/corelib/thread
parent4d943225eb7b8de22e33771b9389c919d59a4bd3 (diff)
Fix race condition in QThreadPool::clear
Since we drop the lock while deleting threads, we need to handle the queue possibly being accessed and changed by the pool threads while clear() is running. Pick-to: 5.15 Fixes: QTBUG-87092 Change-Id: I7611edab90520454278502a58621e299f9cd1f6e Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Diffstat (limited to 'src/corelib/thread')
-rw-r--r--src/corelib/thread/qthreadpool.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp
index 1b417aa8be..5765bf6b09 100644
--- a/src/corelib/thread/qthreadpool.cpp
+++ b/src/corelib/thread/qthreadpool.cpp
@@ -325,7 +325,8 @@ bool QThreadPoolPrivate::waitForDone(int msecs)
void QThreadPoolPrivate::clear()
{
QMutexLocker locker(&mutex);
- for (QueuePage *page : qAsConst(queue)) {
+ while (!queue.isEmpty()) {
+ auto *page = queue.takeLast();
while (!page->isFinished()) {
QRunnable *r = page->pop();
if (r && r->autoDelete()) {
@@ -335,9 +336,8 @@ void QThreadPoolPrivate::clear()
locker.relock();
}
}
+ delete page;
}
- qDeleteAll(queue);
- queue.clear();
}
/*!