diff options
author | Nick Shaforostoff <shafff@ukr.net> | 2014-06-16 18:50:12 +0300 |
---|---|---|
committer | Nick Shaforostoff <shafff@ukr.net> | 2014-12-24 15:01:36 +0100 |
commit | 5b11e43e9f7551b9cb1ea7a6effdcab4bfa6b8c9 (patch) | |
tree | 8a51cb9b664e355ec9e89ad648f20344eaea10d9 /src/corelib/thread/qthreadpool.cpp | |
parent | 6475462c6fdf28f40a35cb6926b2f1f58187eb8a (diff) |
QThreadPool::cancel() to remove individual jobs from the job queue.
[ChangeLog][QtCore][QThreadPool] Added QThreadPool::cancel() which allows
removing from the job queue a job that hasn't been started yet.
Change-Id: Ib8f1c1f32a34f5eec8338c641d820b928e470164
Reviewed-by: Nick Shaforostoff <shafff@ukr.net>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/thread/qthreadpool.cpp')
-rw-r--r-- | src/corelib/thread/qthreadpool.cpp | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp index 2a7cb8d66b..aaffdc2a4c 100644 --- a/src/corelib/thread/qthreadpool.cpp +++ b/src/corelib/thread/qthreadpool.cpp @@ -311,14 +311,12 @@ void QThreadPoolPrivate::clear() /*! \internal Searches for \a runnable in the queue, removes it from the queue and - runs it if found. This function does not return until the runnable - has completed. + returns \c true if it was found in the queue */ -void QThreadPoolPrivate::stealRunnable(QRunnable *runnable) +bool QThreadPoolPrivate::stealRunnable(QRunnable *runnable) { if (runnable == 0) - return; - bool found = false; + return false; { QMutexLocker locker(&mutex); QList<QPair<QRunnable *, int> >::iterator it = queue.begin(); @@ -326,17 +324,26 @@ void QThreadPoolPrivate::stealRunnable(QRunnable *runnable) while (it != end) { if (it->first == runnable) { - found = true; queue.erase(it); - break; + return true; } ++it; } } - if (!found) - return; + return false; +} + /*! + \internal + Searches for \a runnable in the queue, removes it from the queue and + runs it if found. This function does not return until the runnable + has completed. + */ +void QThreadPoolPrivate::stealAndRunRunnable(QRunnable *runnable) +{ + if (!stealRunnable(runnable)) + return; const bool autoDelete = runnable->autoDelete(); bool del = autoDelete && !--runnable->ref; @@ -628,6 +635,25 @@ void QThreadPool::clear() d->clear(); } +/*! + \since 5.5 + + Removes the specified \a runnable from the queue if it is not yet started. + The runnables for which \l{QRunnable::autoDelete()}{runnable->autoDelete()} + returns \c true are deleted. + + \sa start() +*/ +void QThreadPool::cancel(QRunnable *runnable) +{ + Q_D(QThreadPool); + if (!d->stealRunnable(runnable)) + return; + if (runnable->autoDelete() && !--runnable->ref) { + delete runnable; + } +} + QT_END_NAMESPACE #endif |