summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMauro Persano <mauro.persano@kdab.com>2016-01-05 19:42:47 -0200
committerVolker Krause <volker.krause@kdab.com>2016-01-08 07:46:19 +0000
commit8422eca046937d05da92596345be76e55b354d23 (patch)
treeba0e173879ee3f249dd914309044c0db49b3b449 /src
parentcf596337cd68577b93bb868137d52b713c347066 (diff)
Fix race on QAspectManager shutdown
When QAspectManager::quit() is called, the exec() loop finishes. Then QAspectThread calls shutdown() and deletes the QAspectManager instance. However, in certain cases, the QAspectManager object can be deleted before QAspectThread::quit() has a chance to finish running, causing a crash when it tries to acquire the m_waitForEndOfExec semaphore. Make exec() wait for quit() to prevent this. Change-Id: I579e3e6b5684984ec32497852d94cc050cccbef5 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/aspects/qaspectmanager.cpp4
-rw-r--r--src/core/aspects/qaspectmanager_p.h1
2 files changed, 5 insertions, 0 deletions
diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp
index 3c7816081..80faef768 100644
--- a/src/core/aspects/qaspectmanager.cpp
+++ b/src/core/aspects/qaspectmanager.cpp
@@ -68,6 +68,7 @@ QAspectManager::QAspectManager(QObject *parent)
, m_changeArbiter(new QChangeArbiter(this))
, m_serviceLocator(new QServiceLocator())
, m_waitForEndOfExecLoop(0)
+ , m_waitForQuit(0)
{
qRegisterMetaType<QSurface *>("QSurface*");
m_runMainLoop.fetchAndStoreOrdered(0);
@@ -227,6 +228,7 @@ void QAspectManager::exec()
qCDebug(Aspects) << Q_FUNC_INFO << "Exiting event loop";
m_waitForEndOfExecLoop.release(1);
+ m_waitForQuit.acquire(1);
}
void QAspectManager::quit()
@@ -244,6 +246,8 @@ void QAspectManager::quit()
// We need to wait for the QAspectManager exec loop to terminate
m_waitForEndOfExecLoop.acquire(1);
+ m_waitForQuit.release(1);
+
qCDebug(Aspects) << Q_FUNC_INFO << "Exited event loop";
}
diff --git a/src/core/aspects/qaspectmanager_p.h b/src/core/aspects/qaspectmanager_p.h
index 9224a90bf..88ceceb29 100644
--- a/src/core/aspects/qaspectmanager_p.h
+++ b/src/core/aspects/qaspectmanager_p.h
@@ -107,6 +107,7 @@ private:
QAtomicInt m_terminated;
QScopedPointer<QServiceLocator> m_serviceLocator;
QSemaphore m_waitForEndOfExecLoop;
+ QSemaphore m_waitForQuit;
};
} // namespace Qt3DCore