summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2015-08-05 12:49:11 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-08-06 13:43:24 +0000
commit9b6ca58d5d49acdff284e5e4853b338bb60572e8 (patch)
tree17c4fc30c4eb8b488eb022a34a8b0e47f652df23 /src/core
parent5a5a40f9f442f2176cfd08a44f3f005a1e8ce779 (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.cpp8
-rw-r--r--src/core/aspects/qabstractaspect.h2
-rw-r--r--src/core/aspects/qaspectmanager.cpp19
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";