summaryrefslogtreecommitdiffstats
path: root/src/core/qchangearbiter.cpp
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer.ecortex@kdab.com>2014-11-03 15:59:20 +0000
committerSean Harmer <sean.harmer@kdab.com>2014-11-03 17:43:00 +0100
commit0270f7eadf90e852c2a1b7a2e84bf917365b02f5 (patch)
tree30bdd9f91710625aa08efb3dfcabc6564e0f30b1 /src/core/qchangearbiter.cpp
parentea3f99ebe1c846f46fa73d86aa65c4d660a848c4 (diff)
Release the TLS for the main thread's change queue in the arbiter
This solves the QFontCache shutdown bug. Now I think all that is left it to shutdown the render submission thread cleanly. Task-number: QTBUG-42353 Change-Id: If17c62680302cffa266782261400ae44bfbac612 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/core/qchangearbiter.cpp')
-rw-r--r--src/core/qchangearbiter.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/core/qchangearbiter.cpp b/src/core/qchangearbiter.cpp
index 435d7cf8a..55c4c070a 100644
--- a/src/core/qchangearbiter.cpp
+++ b/src/core/qchangearbiter.cpp
@@ -184,6 +184,12 @@ void QChangeArbiter::appendLockingChangeQueue(QChangeArbiter::ChangeQueue *queue
m_lockingChangeQueues.append(queue);
}
+void QChangeArbiter::removeLockingChangeQueue(QChangeArbiter::ChangeQueue *queue)
+{
+ QMutexLocker locker(&m_mutex);
+ m_lockingChangeQueues.removeOne(queue);
+}
+
void QChangeArbiter::syncChanges()
{
QMutexLocker locker(&m_mutex);
@@ -273,7 +279,7 @@ void QChangeArbiter::setPostman(QObserverInterface *postman)
void QChangeArbiter::createUnmanagedThreadLocalChangeQueue(void *changeArbiter)
{
- Q_CHECK_PTR(changeArbiter);
+ Q_ASSERT(changeArbiter);
QChangeArbiter *arbiter = static_cast<QChangeArbiter *>(changeArbiter);
@@ -287,8 +293,15 @@ void QChangeArbiter::createUnmanagedThreadLocalChangeQueue(void *changeArbiter)
void QChangeArbiter::destroyUnmanagedThreadLocalChangeQueue(void *changeArbiter)
{
- // TODO: Implement me!
- Q_UNUSED(changeArbiter);
+ Q_ASSERT(changeArbiter);
+
+ QChangeArbiter *arbiter = static_cast<QChangeArbiter *>(changeArbiter);
+ qCDebug(ChangeArbiter) << Q_FUNC_INFO << QThread::currentThread();
+ if (arbiter->tlsChangeQueue()->hasLocalData()) {
+ ChangeQueue *localChangeQueue = arbiter->tlsChangeQueue()->localData();
+ arbiter->removeLockingChangeQueue(localChangeQueue);
+ arbiter->tlsChangeQueue()->setLocalData(Q_NULLPTR);
+ }
}
void QChangeArbiter::createThreadLocalChangeQueue(void *changeArbiter)