summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-03-17 13:06:07 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-03-17 16:13:48 +0100
commitb43082650174288553961a1afeff3a84e5860c28 (patch)
treea906e3eb79496aac29d7c38c88b9b3b040cf884b
parent1b4d01d163a19bc5bc290930c879fba83d870826 (diff)
Fix memory leak on new QThreadPool::tryStart version
Also documents the ownership of the traditional tryStart better, and remove a redundant check. Change-Id: I06202465b782926724fa33a901d08c1626f87373 Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
-rw-r--r--src/corelib/thread/qthreadpool.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp
index a9352c3894..44cdf071df 100644
--- a/src/corelib/thread/qthreadpool.cpp
+++ b/src/corelib/thread/qthreadpool.cpp
@@ -534,7 +534,7 @@ void QThreadPool::start(std::function<void()> functionToRun, int priority)
does nothing and returns \c false. Otherwise, \a runnable is run immediately
using one available thread and this function returns \c true.
- Note that the thread pool takes ownership of the \a runnable if
+ Note that on success the thread pool takes ownership of the \a runnable if
\l{QRunnable::autoDelete()}{runnable->autoDelete()} returns \c true,
and the \a runnable will be deleted automatically by the thread
pool after the \l{QRunnable::run()}{runnable->run()} returns. If
@@ -549,12 +549,7 @@ bool QThreadPool::tryStart(QRunnable *runnable)
return false;
Q_D(QThreadPool);
-
QMutexLocker locker(&d->mutex);
-
- if (d->allThreads.isEmpty() == false && d->activeThreadCount() >= d->maxThreadCount)
- return false;
-
return d->tryStart(runnable);
}
@@ -571,7 +566,17 @@ bool QThreadPool::tryStart(std::function<void()> functionToRun)
{
if (!functionToRun)
return false;
- return tryStart(QRunnable::create(std::move(functionToRun)));
+
+ Q_D(QThreadPool);
+ QMutexLocker locker(&d->mutex);
+ if (!d->allThreads.isEmpty() && d->activeThreadCount() >= d->maxThreadCount)
+ return false;
+
+ QRunnable *runnable = QRunnable::create(std::move(functionToRun));
+ if (d->tryStart(runnable))
+ return true;
+ delete runnable;
+ return false;
}
/*! \property QThreadPool::expiryTimeout