summaryrefslogtreecommitdiffstats
path: root/src/engine/engineworkerscheduler.cpp
diff options
context:
space:
mode:
authorRJ Ryan <rryan@mixxx.org>2014-01-21 10:00:42 -0800
committerRJ Ryan <rryan@mixxx.org>2014-01-21 10:00:42 -0800
commitadafc74401a9acb38b272f1a3e34768e76022af5 (patch)
tree1714d14d58130bcba8864a344ce29e8d4e7d19cc /src/engine/engineworkerscheduler.cpp
parenta37d273fd8f8c51aa1b03deffbbca7dcb8adfa79 (diff)
Only wake up EngineWorkerScheduler if there are worker threads to be started.
Diffstat (limited to 'src/engine/engineworkerscheduler.cpp')
-rw-r--r--src/engine/engineworkerscheduler.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/engine/engineworkerscheduler.cpp b/src/engine/engineworkerscheduler.cpp
index c0ca0a4a3f..3b9fe77d7d 100644
--- a/src/engine/engineworkerscheduler.cpp
+++ b/src/engine/engineworkerscheduler.cpp
@@ -7,7 +7,8 @@
#include "engine/engineworkerscheduler.h"
EngineWorkerScheduler::EngineWorkerScheduler(QObject* pParent)
- : m_scheduleFIFO(MAX_ENGINE_WORKERS),
+ : m_bWakeScheduler(false),
+ m_scheduleFIFO(MAX_ENGINE_WORKERS),
m_bQuit(false) {
Q_UNUSED(pParent);
}
@@ -24,11 +25,18 @@ void EngineWorkerScheduler::workerReady(EngineWorker* pWorker) {
// in this slot. Write the address of the variable pWorker, since it is
// a 1-element array.
m_scheduleFIFO.write(&pWorker, 1);
+ m_bWakeScheduler = true;
}
}
void EngineWorkerScheduler::runWorkers() {
- m_waitCondition.wakeAll();
+ // Wake the scheduler if we have written a worker-ready message to the
+ // scheduler. There is no race condition in accessing this boolean because
+ // both workerReady and runWorkers are called from the callback thread.
+ if (m_bWakeScheduler) {
+ m_bWakeScheduler = false;
+ m_waitCondition.wakeAll();
+ }
}
void EngineWorkerScheduler::run() {