Add QThreadPool::stackSize
Allows setting the stack size for the thread pool worker threads. Implemented using QThread::stackSize. Task-number: QTBUG-2568 Change-Id: Ic7f3981289290685195bbaee977a23e0c3c49bf0 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This commit is contained in:
parent
5c9c55906c
commit
e44ff19783
@ -74,7 +74,9 @@ public:
|
||||
*/
|
||||
QThreadPoolThread::QThreadPoolThread(QThreadPoolPrivate *manager)
|
||||
:manager(manager), runnable(0)
|
||||
{ }
|
||||
{
|
||||
setStackSize(manager->stackSize);
|
||||
}
|
||||
|
||||
/*
|
||||
\internal
|
||||
@ -604,6 +606,30 @@ void QThreadPool::reserveThread()
|
||||
++d->reservedThreads;
|
||||
}
|
||||
|
||||
/*! \property QThreadPool::stacksize
|
||||
|
||||
This property contains the stack size for the thread pool worker
|
||||
threads.
|
||||
|
||||
The value of the property is uses when the thread pool creates
|
||||
new threads only. Changing it has no effect for already created
|
||||
or running threads.
|
||||
|
||||
The default value is 0, which makes QThread use the operating
|
||||
system default stack stize.
|
||||
*/
|
||||
void QThreadPool::setStackSize(uint stackSize)
|
||||
{
|
||||
Q_D(QThreadPool);
|
||||
d->stackSize = stackSize;
|
||||
}
|
||||
|
||||
uint QThreadPool::stackSize() const
|
||||
{
|
||||
Q_D(const QThreadPool);
|
||||
return d->stackSize;
|
||||
}
|
||||
|
||||
/*!
|
||||
Releases a thread previously reserved by a call to reserveThread().
|
||||
|
||||
|
@ -58,6 +58,7 @@ class Q_CORE_EXPORT QThreadPool : public QObject
|
||||
Q_PROPERTY(int expiryTimeout READ expiryTimeout WRITE setExpiryTimeout)
|
||||
Q_PROPERTY(int maxThreadCount READ maxThreadCount WRITE setMaxThreadCount)
|
||||
Q_PROPERTY(int activeThreadCount READ activeThreadCount)
|
||||
Q_PROPERTY(uint stackSize READ stackSize WRITE setStackSize)
|
||||
friend class QFutureInterfaceBase;
|
||||
|
||||
public:
|
||||
@ -77,6 +78,9 @@ public:
|
||||
|
||||
int activeThreadCount() const;
|
||||
|
||||
void setStackSize(uint stackSize);
|
||||
uint stackSize() const;
|
||||
|
||||
void reserveThread();
|
||||
void releaseThread();
|
||||
|
||||
|
@ -96,6 +96,7 @@ public:
|
||||
int maxThreadCount = QThread::idealThreadCount();
|
||||
int reservedThreads = 0;
|
||||
int activeThreads = 0;
|
||||
uint stackSize = 0;
|
||||
bool isExiting = false;
|
||||
};
|
||||
|
||||
|
@ -92,6 +92,7 @@ private slots:
|
||||
void tryTake();
|
||||
void waitForDoneTimeout();
|
||||
void destroyingWaitsForTasksToFinish();
|
||||
void stackSize();
|
||||
void stressTest();
|
||||
|
||||
private:
|
||||
@ -1136,6 +1137,39 @@ void tst_QThreadPool::destroyingWaitsForTasksToFinish()
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that QThreadPool::stackSize is used when creating
|
||||
// new threads. Note that this tests the Qt property only
|
||||
// since QThread::stackSize() does not reflect the actual
|
||||
// stack size used by the native thread.
|
||||
void tst_QThreadPool::stackSize()
|
||||
{
|
||||
uint targetStackSize = 512 * 1024;
|
||||
uint threadStackSize = 1; // impossible value
|
||||
|
||||
class StackSizeChecker : public QRunnable
|
||||
{
|
||||
public:
|
||||
uint *stackSize;
|
||||
|
||||
StackSizeChecker(uint *stackSize)
|
||||
:stackSize(stackSize)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
*stackSize = QThread::currentThread()->stackSize();
|
||||
}
|
||||
};
|
||||
|
||||
QThreadPool threadPool;
|
||||
threadPool.setStackSize(targetStackSize);
|
||||
threadPool.start(new StackSizeChecker(&threadStackSize));
|
||||
QVERIFY(threadPool.waitForDone(30000)); // 30s timeout
|
||||
QCOMPARE(threadStackSize, targetStackSize);
|
||||
}
|
||||
|
||||
void tst_QThreadPool::stressTest()
|
||||
{
|
||||
class Task : public QRunnable
|
||||
|
Loading…
Reference in New Issue
Block a user