From b0c8495f6c6b9ea5aeb34d4200e8fd3af82609b2 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 23 Jun 2020 04:03:35 +0200 Subject: [PATCH] Replace the filled promise queue busy wait with semaphore --- src/sfizz/FilePool.cpp | 10 +++++----- src/sfizz/FilePool.h | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/sfizz/FilePool.cpp b/src/sfizz/FilePool.cpp index 65a3b357..2abf3b45 100644 --- a/src/sfizz/FilePool.cpp +++ b/src/sfizz/FilePool.cpp @@ -415,10 +415,8 @@ void sfz::FilePool::loadingThread() noexcept threadsLoading--; - while (!filledPromiseQueue.try_push(promise)) { - DBG("[sfizz] Error enqueuing the promise for " << promise->fileId << " in the filledPromiseQueue"); - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } + semFilledPromiseQueueAvailable.wait(); + filledPromiseQueue.push(promise); promise.reset(); } while (1); @@ -447,8 +445,10 @@ void sfz::FilePool::cleanupPromises() noexcept // Remove the promises from the filled queue and put them in a linear // storage FilePromisePtr promise; - while (filledPromiseQueue.try_pop(promise)) + while (filledPromiseQueue.try_pop(promise)) { + semFilledPromiseQueueAvailable.post(); temporaryFilePromises.push_back(promise); + } auto promiseUsedOnce = [](FilePromisePtr& p) { return p.use_count() == 1; }; auto moveToClear = [&](FilePromisePtr& p) { return promisesToClear.push_back(p); }; diff --git a/src/sfizz/FilePool.h b/src/sfizz/FilePool.h index 80e7f8a2..ee81c268 100644 --- a/src/sfizz/FilePool.h +++ b/src/sfizz/FilePool.h @@ -268,6 +268,7 @@ private: atomic_queue::AtomicQueue2 promiseQueue; atomic_queue::AtomicQueue2 filledPromiseQueue; + RTSemaphore semFilledPromiseQueueAvailable { config::maxVoices }; uint32_t preloadSize { config::preloadSize }; Oversampling oversamplingFactor { config::defaultOversamplingFactor }; // Signals