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:
Morten Johan Sørvig 2017-06-21 11:48:09 +02:00
parent 5c9c55906c
commit e44ff19783
4 changed files with 66 additions and 1 deletions

View File

@ -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().

View File

@ -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();

View File

@ -96,6 +96,7 @@ public:
int maxThreadCount = QThread::idealThreadCount();
int reservedThreads = 0;
int activeThreads = 0;
uint stackSize = 0;
bool isExiting = false;
};

View File

@ -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