diff options
author | Janne Koskinen <janne.p.koskinen@theqtcompany.com> | 2016-04-22 14:25:15 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2016-05-18 11:15:25 +0000 |
commit | 028bdfa4f7c7572421e887aeeeb71d193aeab576 (patch) | |
tree | a43704967dbf845b8bf45ee00448cf6384285943 | |
parent | 1a43b5c8a929d185313dcbf4b9eaa15ecc4bdb43 (diff) |
Fix deadlock when quitting aspect manager
Stop waiting for next frame advance if we are about to shut down.
Change-Id: I334c5afa69eb262d6e4e7139acc826fbd7aa9263
Task-number: QTBUG-50044
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/core/aspects/qaspectmanager.cpp | 4 | ||||
-rw-r--r-- | src/render/services/vsyncframeadvanceservice.cpp | 3 |
2 files changed, 5 insertions, 2 deletions
diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp index 790118c89..9df1112b0 100644 --- a/src/core/aspects/qaspectmanager.cpp +++ b/src/core/aspects/qaspectmanager.cpp @@ -99,6 +99,10 @@ void QAspectManager::exitSimulationLoop() { qCDebug(Aspects) << Q_FUNC_INFO; m_runSimulationLoop.fetchAndStoreOrdered(0); + QAbstractFrameAdvanceService *frameAdvanceService = + m_serviceLocator->service<QAbstractFrameAdvanceService>(QServiceLocator::FrameAdvanceService); + if (frameAdvanceService) + frameAdvanceService->stop(); // Give any aspects a chance to unqueue any asynchronous work they // may have scheduled that would otherwise potentially deadlock or diff --git a/src/render/services/vsyncframeadvanceservice.cpp b/src/render/services/vsyncframeadvanceservice.cpp index af97993db..533b0fba1 100644 --- a/src/render/services/vsyncframeadvanceservice.cpp +++ b/src/render/services/vsyncframeadvanceservice.cpp @@ -100,8 +100,7 @@ void VSyncFrameAdvanceService::start() void VSyncFrameAdvanceService::stop() { Q_D(VSyncFrameAdvanceService); - if (d->m_semaphore.available() == 0) - d->m_semaphore.release(1); + d->m_semaphore.release(1); qCDebug(VSyncAdvanceService) << "Terminating VSyncFrameAdvanceService"; } |