diff options
author | Mauro Persano <mauro.persano@kdab.com> | 2016-01-05 19:42:47 -0200 |
---|---|---|
committer | Volker Krause <volker.krause@kdab.com> | 2016-01-08 07:46:19 +0000 |
commit | 8422eca046937d05da92596345be76e55b354d23 (patch) | |
tree | ba0e173879ee3f249dd914309044c0db49b3b449 /src | |
parent | cf596337cd68577b93bb868137d52b713c347066 (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.cpp | 4 | ||||
-rw-r--r-- | src/core/aspects/qaspectmanager_p.h | 1 |
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 |