diff --git a/src/sfizz/FilePool.cpp b/src/sfizz/FilePool.cpp index 6c3a08df..056c76d6 100644 --- a/src/sfizz/FilePool.cpp +++ b/src/sfizz/FilePool.cpp @@ -476,6 +476,8 @@ void sfz::FilePool::dispatchingJob() noexcept continue; } + std::lock_guard guard { loadingJobsMutex }; + if (filesToLoad.try_pop(queuedData)) { loadingJobs.push_back( threadPool.enqueue([this](const QueuedFileData& data) { loadingJob(data); }, queuedData)); @@ -483,7 +485,7 @@ void sfz::FilePool::dispatchingJob() noexcept // Clear finished jobs swapAndPopAll(loadingJobs, [](std::future& future) { - return future.wait_for(std::chrono::seconds(0)) == std::future_status::ready; + return is_ready(future); }); } } @@ -515,8 +517,11 @@ void sfz::FilePool::emptyFileLoadingQueues() noexcept void sfz::FilePool::waitForBackgroundLoading() noexcept { + std::lock_guard guard { loadingJobsMutex }; + for (auto& job : loadingJobs) job.wait(); + loadingJobs.clear(); } diff --git a/src/sfizz/FilePool.h b/src/sfizz/FilePool.h index 109394b4..a44ce948 100644 --- a/src/sfizz/FilePool.h +++ b/src/sfizz/FilePool.h @@ -354,6 +354,7 @@ private: void dispatchingJob() noexcept; void garbageJob() noexcept; void loadingJob(QueuedFileData data) noexcept; + std::mutex loadingJobsMutex; std::vector> loadingJobs; std::thread dispatchThread { &FilePool::dispatchingJob, this }; std::thread garbageThread { &FilePool::garbageJob, this };