From ec1ce1d7388bdf3fe5f69b253100d2110e97ab86 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 12 Oct 2016 13:01:09 +0200 Subject: [PATCH] Fix bool checks across threads to be correct, so it's not optimised out --- qrenderdoc/Code/CaptureContext.h | 5 ++++- qrenderdoc/Code/RenderManager.cpp | 12 ++++++++---- qrenderdoc/Code/RenderManager.h | 6 +++--- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index b519e74b3..14c7a3d94 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -238,6 +238,7 @@ private: std::function m_func; QThread *m_Thread; + QSemaphore completed; public slots: void process() @@ -246,11 +247,13 @@ public slots: m_Thread->quit(); m_Thread->deleteLater(); m_Thread = NULL; + completed.acquire(); } public: explicit LambdaThread(std::function f) { + completed.release(); m_Thread = new QThread(); m_func = f; moveToThread(m_Thread); @@ -258,7 +261,7 @@ public: } void start(QThread::Priority prio = QThread::InheritPriority) { m_Thread->start(prio); } - bool isRunning() { return m_Thread; } + bool isRunning() { return completed.available(); } }; class QMenu; diff --git a/qrenderdoc/Code/RenderManager.cpp b/qrenderdoc/Code/RenderManager.cpp index 85cc2dcd1..45d7f62b0 100644 --- a/qrenderdoc/Code/RenderManager.cpp +++ b/qrenderdoc/Code/RenderManager.cpp @@ -75,9 +75,13 @@ void RenderManager::BlockInvoke(RenderManager::InvokeMethod m) PushInvoke(cmd); - while(!cmd->processed) + for(;;) { + if(cmd->processed.tryAcquire()) + break; } + + delete cmd; } void RenderManager::CloseThread() @@ -102,7 +106,7 @@ void RenderManager::PushInvoke(RenderManager::InvokeHandle *cmd) { if(m_Thread == NULL || !m_Thread->isRunning() || !m_Running) { - cmd->processed = true; + cmd->processed.release(); if(cmd->selfdelete) delete cmd; return; @@ -150,7 +154,7 @@ void RenderManager::run() if(cmd->method != NULL) cmd->method(renderer); - cmd->processed = true; + cmd->processed.release(); // if it's a throwaway command, delete it if(cmd->selfdelete) @@ -171,7 +175,7 @@ void RenderManager::run() if(cmd == NULL) continue; - cmd->processed = true; + cmd->processed.release(); if(cmd->selfdelete) delete cmd; diff --git a/qrenderdoc/Code/RenderManager.h b/qrenderdoc/Code/RenderManager.h index 5a5314a29..7aa3a0ad9 100644 --- a/qrenderdoc/Code/RenderManager.h +++ b/qrenderdoc/Code/RenderManager.h @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -62,12 +63,11 @@ private: InvokeHandle(InvokeMethod m) { method = m; - processed = false; - selfdelete = true; + selfdelete = false; } InvokeMethod method; - bool processed; + QSemaphore processed; bool selfdelete; };