Replace the clearing thread busy wait with semaphore
This commit is contained in:
parent
792b62cc78
commit
f91ee9cdfa
2 changed files with 15 additions and 5 deletions
|
|
@ -125,11 +125,16 @@ sfz::FilePool::~FilePool()
|
||||||
{
|
{
|
||||||
quitThread = true;
|
quitThread = true;
|
||||||
|
|
||||||
|
std::error_code ec;
|
||||||
|
|
||||||
for (unsigned i = 0; i < threadPool.size(); ++i) {
|
for (unsigned i = 0; i < threadPool.size(); ++i) {
|
||||||
std::error_code ec;
|
ec = std::error_code();
|
||||||
workerBarrier.post(ec);
|
workerBarrier.post(ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ec = std::error_code();
|
||||||
|
semClearingRequest.post(ec);
|
||||||
|
|
||||||
for (auto& thread: threadPool)
|
for (auto& thread: threadPool)
|
||||||
thread.join();
|
thread.join();
|
||||||
}
|
}
|
||||||
|
|
@ -360,10 +365,13 @@ void sfz::FilePool::tryToClearPromises()
|
||||||
|
|
||||||
void sfz::FilePool::clearingThread()
|
void sfz::FilePool::clearingThread()
|
||||||
{
|
{
|
||||||
while (!quitThread) {
|
RTSemaphore& request = semClearingRequest;
|
||||||
|
do {
|
||||||
|
request.wait();
|
||||||
|
if (quitThread)
|
||||||
|
return;
|
||||||
tryToClearPromises();
|
tryToClearPromises();
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
} while (1);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sfz::FilePool::loadingThread() noexcept
|
void sfz::FilePool::loadingThread() noexcept
|
||||||
|
|
@ -443,7 +451,8 @@ void sfz::FilePool::cleanupPromises() noexcept
|
||||||
|
|
||||||
auto promiseUsedOnce = [](FilePromisePtr& p) { return p.use_count() == 1; };
|
auto promiseUsedOnce = [](FilePromisePtr& p) { return p.use_count() == 1; };
|
||||||
auto moveToClear = [&](FilePromisePtr& p) { return promisesToClear.push_back(p); };
|
auto moveToClear = [&](FilePromisePtr& p) { return promisesToClear.push_back(p); };
|
||||||
swapAndPopAll(temporaryFilePromises, promiseUsedOnce, moveToClear);
|
if (swapAndPopAll(temporaryFilePromises, promiseUsedOnce, moveToClear) > 0)
|
||||||
|
semClearingRequest.post();
|
||||||
}
|
}
|
||||||
|
|
||||||
void sfz::FilePool::setOversamplingFactor(sfz::Oversampling factor) noexcept
|
void sfz::FilePool::setOversamplingFactor(sfz::Oversampling factor) noexcept
|
||||||
|
|
|
||||||
|
|
@ -275,6 +275,7 @@ private:
|
||||||
volatile bool emptyQueue { false };
|
volatile bool emptyQueue { false };
|
||||||
std::atomic<int> threadsLoading { 0 };
|
std::atomic<int> threadsLoading { 0 };
|
||||||
RTSemaphore workerBarrier;
|
RTSemaphore workerBarrier;
|
||||||
|
RTSemaphore semClearingRequest;
|
||||||
|
|
||||||
// File promises data structures along with their guards.
|
// File promises data structures along with their guards.
|
||||||
std::vector<FilePromisePtr> emptyPromises;
|
std::vector<FilePromisePtr> emptyPromises;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue