diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2015-08-05 12:49:11 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-08-06 13:43:24 +0000 |
commit | 9b6ca58d5d49acdff284e5e4853b338bb60572e8 (patch) | |
tree | 17c4fc30c4eb8b488eb022a34a8b0e47f652df23 /src/core | |
parent | 5a5a40f9f442f2176cfd08a44f3f005a1e8ce779 (diff) |
Add onStartup() and onShutdown() virtuals to QAbstractAspect
Gives aspects a chance to do work just prior to and just after the
main loop in QAspectManager.
Specifically the shutdown functionality is required for the upcoming
logic aspect to ensure a clean shutdown.
Added the onStartup() method for symmetry.
Change-Id: If5f32d62629543cdceb2e6e3ff6383747acb7c99
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/aspects/qabstractaspect.cpp | 8 | ||||
-rw-r--r-- | src/core/aspects/qabstractaspect.h | 2 | ||||
-rw-r--r-- | src/core/aspects/qaspectmanager.cpp | 19 |
3 files changed, 28 insertions, 1 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp index 1974e8af9..227457cb9 100644 --- a/src/core/aspects/qabstractaspect.cpp +++ b/src/core/aspects/qabstractaspect.cpp @@ -195,6 +195,14 @@ bool QAbstractAspect::isShuttingDown() const return d->m_aspectManager->isShuttingDown(); } +void QAbstractAspect::onStartup() +{ +} + +void QAbstractAspect::onShutdown() +{ +} + } // of namespace Qt3D QT_END_NAMESPACE diff --git a/src/core/aspects/qabstractaspect.h b/src/core/aspects/qabstractaspect.h index 1ea814309..12d5044a1 100644 --- a/src/core/aspects/qabstractaspect.h +++ b/src/core/aspects/qabstractaspect.h @@ -104,6 +104,8 @@ protected: private: virtual void setRootEntity(QEntity *rootObject) = 0; virtual void onInitialize(const QVariantMap &data) = 0; + virtual void onStartup(); + virtual void onShutdown(); virtual void onCleanup() = 0; Q_DECLARE_PRIVATE(QAbstractAspect) diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp index 578ff9411..e6752f19c 100644 --- a/src/core/aspects/qaspectmanager.cpp +++ b/src/core/aspects/qaspectmanager.cpp @@ -181,9 +181,18 @@ void QAspectManager::exec() m_serviceLocator->service<QAbstractFrameAdvanceService>(QServiceLocator::FrameAdvanceService); // Start the frameAdvanceService if we're about to enter the running loop - if (m_runMainLoop.load()) + bool needsShutdown = false; + if (m_runMainLoop.load()) { + needsShutdown = true; frameAdvanceService->start(); + // We are about to enter the main loop. Give aspects a chance to do any last + // pieces of initialization + qCDebug(Aspects) << "Calling onStartup() for each aspect"; + Q_FOREACH (QAbstractAspect *aspect, m_aspects) + aspect->onStartup(); + } + // Only enter main render loop once the renderer and other aspects are initialized while (m_runMainLoop.load()) { @@ -200,6 +209,14 @@ void QAspectManager::exec() // Process any pending events eventLoop.processEvents(); } + + if (needsShutdown) { + // Give aspects a chance to perform any shutdown actions. This may include unqueuing + // any blocking work on the main thread that could potentially deadlock during shutdown. + qCDebug(Aspects) << "Calling onShutdown() for each aspect"; + Q_FOREACH (QAbstractAspect *aspect, m_aspects) + aspect->onShutdown(); + } } qCDebug(Aspects) << Q_FUNC_INFO << "Exiting event loop"; |