Fix bool checks across threads to be correct, so it's not optimised out

This commit is contained in:
baldurk
2016-10-12 13:01:09 +02:00
parent d316701f61
commit ec1ce1d738
3 changed files with 15 additions and 8 deletions
+4 -1
View File
@@ -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;
+8 -4
View File
@@ -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;
+3 -3
View File
@@ -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;
};