diff --git a/src/sfizz/FilePool.cpp b/src/sfizz/FilePool.cpp index 6c3a08df..ca437d52 100644 --- a/src/sfizz/FilePool.cpp +++ b/src/sfizz/FilePool.cpp @@ -482,6 +482,7 @@ void sfz::FilePool::dispatchingJob() noexcept } // Clear finished jobs + std::lock_guard guard { loadingJobsMutex }; swapAndPopAll(loadingJobs, [](std::future& future) { return future.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }); @@ -515,8 +516,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..94f2fb2d 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; + SpinMutex loadingJobsMutex; std::vector> loadingJobs; std::thread dispatchThread { &FilePool::dispatchingJob, this }; std::thread garbageThread { &FilePool::garbageJob, this };