From ccd4ff3c2c2abcbadcf7a5f8cef750ae7cafa34c Mon Sep 17 00:00:00 2001 From: Lukas W Date: Sun, 29 Apr 2018 17:01:51 +0200 Subject: [PATCH] Fix job queue crash * Don't add jobs when job queue is full * Icrease job queue size from 1024 to 8192 --- include/MixerWorkerThread.h | 2 +- src/core/MixerWorkerThread.cpp | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/MixerWorkerThread.h b/include/MixerWorkerThread.h index 8b900195f..4af42897c 100644 --- a/include/MixerWorkerThread.h +++ b/include/MixerWorkerThread.h @@ -62,7 +62,7 @@ public: void wait(); private: -#define JOB_QUEUE_SIZE 1024 +#define JOB_QUEUE_SIZE 8192 QAtomicPointer m_items[JOB_QUEUE_SIZE]; AtomicInt m_queueSize; AtomicInt m_itemsDone; diff --git a/src/core/MixerWorkerThread.cpp b/src/core/MixerWorkerThread.cpp index e8c6bd61c..14363f4d1 100644 --- a/src/core/MixerWorkerThread.cpp +++ b/src/core/MixerWorkerThread.cpp @@ -25,6 +25,7 @@ #include "MixerWorkerThread.h" #include "denormals.h" +#include #include #include #include "ThreadableJob.h" @@ -54,7 +55,13 @@ void MixerWorkerThread::JobQueue::addJob( ThreadableJob * _job ) // update job state _job->queue(); // actually queue the job via atomic operations - m_items[m_queueSize.fetchAndAddOrdered(1)] = _job; + auto index = m_queueSize.fetchAndAddOrdered(1); + if (index < JOB_QUEUE_SIZE) { + m_items[index] = _job; + } else { + qWarning() << "Job queue is full!"; + m_itemsDone.fetchAndAddOrdered(1); + } } } @@ -66,7 +73,7 @@ void MixerWorkerThread::JobQueue::run() while( processedJob && (int) m_itemsDone < (int) m_queueSize ) { processedJob = false; - for( int i = 0; i < m_queueSize; ++i ) + for( int i = 0; i < m_queueSize && i < JOB_QUEUE_SIZE; ++i ) { ThreadableJob * job = m_items[i].fetchAndStoreOrdered( NULL ); if( job )