diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp index b7021817c52ffce5d3ec0473bfa684879c59374f..870f943a63cb71c6e3cc5de2ac39f16330df6cb5 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(); }