diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2012-04-16 14:43:27 +0300 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-17 18:44:13 +0200 |
commit | cbaf52b09971edf6f3e1458f7dd677b80a1568ed (patch) | |
tree | 69397551456ebd1cf18cd3e7ff2a3fb88090858d /src/corelib/thread | |
parent | 95bd974163d9103634a5ce4cbfc9bc3c4827dee1 (diff) |
QThreadPool: optimize enqueueTask() for common case
the most-common case is: queue is empty or filled with tasks of
the same priority; so the runnable would be put at the end of queue.
both checks are cheap for us.
also avoid detach()'ing by using const iterators
Change-Id: Iab2255f852211f9accc8d717f778671661210ef3
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Diffstat (limited to 'src/corelib/thread')
-rw-r--r-- | src/corelib/thread/qthreadpool.cpp | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp index b7021817c5..870f943a63 100644 --- a/src/corelib/thread/qthreadpool.cpp +++ b/src/corelib/thread/qthreadpool.cpp @@ -47,15 +47,6 @@ QT_BEGIN_NAMESPACE -inline bool operator<(int priority, const QPair<QRunnable *, int> &p) -{ - return p.second < priority; -} -inline bool operator<(const QPair<QRunnable *, int> &p, int priority) -{ - return priority < p.second; -} - Q_GLOBAL_STATIC(QThreadPool, theInstance) /* @@ -209,15 +200,22 @@ bool QThreadPoolPrivate::tryStart(QRunnable *task) return true; } +inline bool operator<(int priority, const QPair<QRunnable *, int> &p) +{ return p.second < priority; } +inline bool operator<(const QPair<QRunnable *, int> &p, int priority) +{ return priority < p.second; } + void QThreadPoolPrivate::enqueueTask(QRunnable *runnable, int priority) { if (runnable->autoDelete()) ++runnable->ref; // put it on the queue - QList<QPair<QRunnable *, int> >::iterator at = - qUpperBound(queue.begin(), queue.end(), priority); - queue.insert(at, qMakePair(runnable, priority)); + QList<QPair<QRunnable *, int> >::const_iterator begin = queue.constBegin(); + QList<QPair<QRunnable *, int> >::const_iterator it = queue.constEnd(); + if (it != begin && priority < (*(it - 1)).second) + it = qUpperBound(begin, --it, priority); + queue.insert(it - begin, qMakePair(runnable, priority)); runnableReady.wakeOne(); } |