diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-03-17 13:06:07 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-03-17 16:13:48 +0100 |
commit | b43082650174288553961a1afeff3a84e5860c28 (patch) | |
tree | a906e3eb79496aac29d7c38c88b9b3b040cf884b /src/corelib/thread | |
parent | 1b4d01d163a19bc5bc290930c879fba83d870826 (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>
Diffstat (limited to 'src/corelib/thread')
-rw-r--r-- | src/corelib/thread/qthreadpool.cpp | 19 |
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 |