diff options
author | RJ Ryan <rryan@mixxx.org> | 2014-01-21 10:00:42 -0800 |
---|---|---|
committer | RJ Ryan <rryan@mixxx.org> | 2014-01-21 10:00:42 -0800 |
commit | adafc74401a9acb38b272f1a3e34768e76022af5 (patch) | |
tree | 1714d14d58130bcba8864a344ce29e8d4e7d19cc /src/engine/engineworkerscheduler.cpp | |
parent | a37d273fd8f8c51aa1b03deffbbca7dcb8adfa79 (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.cpp | 12 |
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() { |