summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanne Koskinen <janne.p.koskinen@theqtcompany.com>2016-04-22 14:25:15 +0300
committerAntti Määttä <antti.maatta@qt.io>2016-05-18 11:15:25 +0000
commit028bdfa4f7c7572421e887aeeeb71d193aeab576 (patch)
treea43704967dbf845b8bf45ee00448cf6384285943
parent1a43b5c8a929d185313dcbf4b9eaa15ecc4bdb43 (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.cpp4
-rw-r--r--src/render/services/vsyncframeadvanceservice.cpp3
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";
}