mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-27 12:21:11 +00:00
Fix bool checks across threads to be correct, so it's not optimised out
This commit is contained in:
@@ -238,6 +238,7 @@ private:
|
||||
|
||||
std::function<void()> 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<void()> 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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
#include <QMutex>
|
||||
#include <QQueue>
|
||||
#include <QSemaphore>
|
||||
#include <QString>
|
||||
#include <QThread>
|
||||
#include <QWaitCondition>
|
||||
@@ -62,12 +63,11 @@ private:
|
||||
InvokeHandle(InvokeMethod m)
|
||||
{
|
||||
method = m;
|
||||
processed = false;
|
||||
selfdelete = true;
|
||||
selfdelete = false;
|
||||
}
|
||||
|
||||
InvokeMethod method;
|
||||
bool processed;
|
||||
QSemaphore processed;
|
||||
bool selfdelete;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user