summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qfutureinterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/thread/qfutureinterface.cpp')
-rw-r--r--src/corelib/thread/qfutureinterface.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp
index 2a79a501e3..ee3d113196 100644
--- a/src/corelib/thread/qfutureinterface.cpp
+++ b/src/corelib/thread/qfutureinterface.cpp
@@ -57,6 +57,19 @@ enum {
MaxProgressEmitsPerSecond = 25
};
+namespace {
+class ThreadPoolThreadReleaser {
+ QThreadPool *m_pool;
+public:
+ explicit ThreadPoolThreadReleaser(QThreadPool *pool)
+ : m_pool(pool)
+ { if (pool) pool->releaseThread(); }
+ ~ThreadPoolThreadReleaser()
+ { if (m_pool) m_pool->reserveThread(); }
+};
+} // unnamed namespace
+
+
QFutureInterfaceBase::QFutureInterfaceBase(State initialState)
: d(new QFutureInterfaceBasePrivate(initialState))
{ }
@@ -182,11 +195,9 @@ void QFutureInterfaceBase::waitForResume()
return;
// decrease active thread count since this thread will wait.
- QThreadPool::globalInstance()->releaseThread();
+ const ThreadPoolThreadReleaser releaser(QThreadPool::globalInstance());
d->pausedWaitCondition.wait(&d->m_mutex);
-
- QThreadPool::globalInstance()->reserveThread();
}
int QFutureInterfaceBase::progressValue() const