QThreadPool: Add Quality of Service API
Same limitation as setting priority; it only applies to threads that start after the call. Change-Id: I0f77467a76ce2f4e7743d04fde344ef08cd8dbb8 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
35066b28c8
commit
e58d714c47
@ -249,6 +249,7 @@ void QThreadPoolPrivate::startThread(QRunnable *runnable)
|
|||||||
if (objectName.isEmpty())
|
if (objectName.isEmpty())
|
||||||
objectName = u"Thread (pooled)"_s;
|
objectName = u"Thread (pooled)"_s;
|
||||||
thread->setObjectName(objectName);
|
thread->setObjectName(objectName);
|
||||||
|
thread->setServiceLevel(serviceLevel);
|
||||||
Q_ASSERT(!allThreads.contains(thread.get())); // if this assert hits, we have an ABA problem (deleted threads don't get removed here)
|
Q_ASSERT(!allThreads.contains(thread.get())); // if this assert hits, we have an ABA problem (deleted threads don't get removed here)
|
||||||
allThreads.insert(thread.get());
|
allThreads.insert(thread.get());
|
||||||
++activeThreads;
|
++activeThreads;
|
||||||
@ -764,6 +765,38 @@ void QThreadPool::releaseThread()
|
|||||||
d->tryToStartMoreThreads();
|
d->tryToStartMoreThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\since 6.9
|
||||||
|
|
||||||
|
Sets the Quality of Service level of thread objects created after the call
|
||||||
|
to this setter to \a serviceLevel.
|
||||||
|
|
||||||
|
Support is not available on every platform. Consult
|
||||||
|
QThread::setServiceLevel() for details.
|
||||||
|
|
||||||
|
\sa serviceLevel(), QThread::serviceLevel()
|
||||||
|
*/
|
||||||
|
void QThreadPool::setServiceLevel(QThread::QualityOfService serviceLevel)
|
||||||
|
{
|
||||||
|
Q_D(QThreadPool);
|
||||||
|
QMutexLocker locker(&d->mutex);
|
||||||
|
d->serviceLevel = serviceLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\since 6.9
|
||||||
|
|
||||||
|
Returns the current Quality of Service level of the thread.
|
||||||
|
|
||||||
|
\sa setServiceLevel(), QThread::serviceLevel()
|
||||||
|
*/
|
||||||
|
QThread::QualityOfService QThreadPool::serviceLevel() const
|
||||||
|
{
|
||||||
|
Q_D(const QThreadPool);
|
||||||
|
QMutexLocker locker(&d->mutex);
|
||||||
|
return d->serviceLevel;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Releases a thread previously reserved with reserveThread() and uses it
|
Releases a thread previously reserved with reserveThread() and uses it
|
||||||
to run \a runnable.
|
to run \a runnable.
|
||||||
|
@ -72,6 +72,9 @@ public:
|
|||||||
void reserveThread();
|
void reserveThread();
|
||||||
void releaseThread();
|
void releaseThread();
|
||||||
|
|
||||||
|
void setServiceLevel(QThread::QualityOfService serviceLevel);
|
||||||
|
QThread::QualityOfService serviceLevel() const;
|
||||||
|
|
||||||
QT_CORE_INLINE_SINCE(6, 8)
|
QT_CORE_INLINE_SINCE(6, 8)
|
||||||
bool waitForDone(int msecs);
|
bool waitForDone(int msecs);
|
||||||
bool waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever);
|
bool waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever);
|
||||||
|
@ -149,6 +149,7 @@ public:
|
|||||||
int activeThreads = 0;
|
int activeThreads = 0;
|
||||||
uint stackSize = 0;
|
uint stackSize = 0;
|
||||||
QThread::Priority threadPriority = QThread::InheritPriority;
|
QThread::Priority threadPriority = QThread::InheritPriority;
|
||||||
|
QThread::QualityOfService serviceLevel = QThread::QualityOfService::Auto;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -76,6 +76,7 @@ private slots:
|
|||||||
void tryStartCount();
|
void tryStartCount();
|
||||||
void priorityStart_data();
|
void priorityStart_data();
|
||||||
void priorityStart();
|
void priorityStart();
|
||||||
|
void qualityOfService();
|
||||||
void waitForDone();
|
void waitForDone();
|
||||||
void clear();
|
void clear();
|
||||||
void clearWithAutoDelete();
|
void clearWithAutoDelete();
|
||||||
@ -1046,6 +1047,18 @@ void tst_QThreadPool::priorityStart()
|
|||||||
QCOMPARE(firstStarted.loadRelaxed(), expected);
|
QCOMPARE(firstStarted.loadRelaxed(), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QThreadPool::qualityOfService()
|
||||||
|
{
|
||||||
|
QThreadPool p;
|
||||||
|
p.setServiceLevel(QThread::QualityOfService::Eco);
|
||||||
|
QThread::QualityOfService level = QThread::QualityOfService::Auto;
|
||||||
|
p.tryStart([&level](){
|
||||||
|
level = QThread::currentThread()->serviceLevel();
|
||||||
|
});
|
||||||
|
QVERIFY(p.waitForDone(QDeadlineTimer(10s)));
|
||||||
|
QCOMPARE(level, QThread::QualityOfService::Eco);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QThreadPool::waitForDone()
|
void tst_QThreadPool::waitForDone()
|
||||||
{
|
{
|
||||||
QElapsedTimer total, pass;
|
QElapsedTimer total, pass;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user