diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2014-07-16 15:14:16 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2014-07-20 00:18:50 +0200 |
commit | 0f0bf28b05e5d08767aa98f83dc6d5c898cdcc17 (patch) | |
tree | dc3d5505057b900981d6d0d8c54ef90547391104 /src/core/qchangearbiter.cpp | |
parent | c38954f6e6721f9129fe854512bbfdee9fe94546 (diff) |
Ground work to have a proper shutdown
QAspectEngine shutdown invokes QAspectManager quit which will stop the
QAspectThread. Prior to exiting, the QAspectThread calls QAspectManager
shutdown which cleans up all aspects and deletes them.
Renderer stops the RenderThread when cleanup is called and properly deletes
the QGraphicContext and the RenderThread.
Note: Everything is called as it should. However it always ends up in a
segfault caused by the QFont::cleanup when the QThreadStorage of the main
thread GuiApplication is destroyed. I've not been able to find the cause of
that.
Change-Id: I3b7baa843af4d0418b5d04e6d1cda88b962ded7f
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/core/qchangearbiter.cpp')
-rw-r--r-- | src/core/qchangearbiter.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/core/qchangearbiter.cpp b/src/core/qchangearbiter.cpp index 3001ea65b..975ee1412 100644 --- a/src/core/qchangearbiter.cpp +++ b/src/core/qchangearbiter.cpp @@ -76,6 +76,15 @@ QChangeArbiter::QChangeArbiter(QObject *parent) // 6) Mutex is unlocked - leaving SyncChanges } +QChangeArbiter::~QChangeArbiter() +{ + Q_D(QChangeArbiter); + if (d->m_jobManager != Q_NULLPTR) + d->m_jobManager->waitForPerThreadFunction(QChangeArbiter::destroyThreadLocalChangeQueue, this); + d->m_lockingChangeQueues.clear(); + d->m_changeQueues.clear(); +} + QChangeArbiter::QChangeArbiter(QChangeArbiterPrivate &dd, QObject *parent) : QObject(dd, parent) @@ -262,7 +271,7 @@ void QChangeArbiter::createUnmanagedThreadLocalChangeQueue(void *changeArbiter) } } -static void destroyUnmanagedThreadLocalChangeQueue(void *changeArbiter) +void QChangeArbiter::destroyUnmanagedThreadLocalChangeQueue(void *changeArbiter) { // TODO: Implement me! Q_UNUSED(changeArbiter); @@ -282,7 +291,7 @@ void QChangeArbiter::createThreadLocalChangeQueue(void *changeArbiter) } } -static void destroyThreadLocalChangeQueue(void *changeArbiter) +void QChangeArbiter::destroyThreadLocalChangeQueue(void *changeArbiter) { // TODO: Implement me! Q_UNUSED(changeArbiter); |