From f25dd03db0caff9645d3bdf4d23083ccbce060b2 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 23 Jun 2020 03:59:20 +0200 Subject: [PATCH] Replace the queue emptying busy wait with semaphore --- src/sfizz/FilePool.cpp | 16 +++++----------- src/sfizz/FilePool.h | 1 + 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/sfizz/FilePool.cpp b/src/sfizz/FilePool.cpp index b18d5254..cc0ed7b8 100644 --- a/src/sfizz/FilePool.cpp +++ b/src/sfizz/FilePool.cpp @@ -378,19 +378,17 @@ void sfz::FilePool::loadingThread() noexcept { FilePromisePtr promise; while (!quitThread) { + workerBarrier.wait(); if (emptyQueue) { - while(promiseQueue.try_pop(promise)) { + while (promiseQueue.try_pop(promise)) { // We're just dequeuing } emptyQueue = false; + semEmptyQueueFinished.post(); continue; } - std::error_code ec; - workerBarrier.wait(ec); - ASSERT(!ec); - if (!promiseQueue.try_pop(promise)) { continue; } @@ -483,12 +481,8 @@ uint32_t sfz::FilePool::getPreloadSize() const noexcept void sfz::FilePool::emptyFileLoadingQueues() noexcept { emptyQueue = true; - std::error_code ec; - workerBarrier.post(ec); - ASSERT(!ec); - - while (emptyQueue) - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + workerBarrier.post(); + semEmptyQueueFinished.wait(); } void sfz::FilePool::waitForBackgroundLoading() noexcept diff --git a/src/sfizz/FilePool.h b/src/sfizz/FilePool.h index 1325168c..80e7f8a2 100644 --- a/src/sfizz/FilePool.h +++ b/src/sfizz/FilePool.h @@ -273,6 +273,7 @@ private: // Signals volatile bool quitThread { false }; volatile bool emptyQueue { false }; + RTSemaphore semEmptyQueueFinished; std::atomic threadsLoading { 0 }; RTSemaphore workerBarrier; RTSemaphore semClearingRequest;