diff options
author | Sean Harmer <sean.harmer.ecortex@kdab.com> | 2014-11-03 15:59:20 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2014-11-03 17:43:00 +0100 |
commit | 0270f7eadf90e852c2a1b7a2e84bf917365b02f5 (patch) | |
tree | 30bdd9f91710625aa08efb3dfcabc6564e0f30b1 /src/core/qchangearbiter.cpp | |
parent | ea3f99ebe1c846f46fa73d86aa65c4d660a848c4 (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.cpp | 19 |
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) |