From 87629978d30fb262ba55214e6a92cc7608fe0062 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Thu, 6 Oct 2016 15:51:58 -0700 Subject: [PATCH] [pzstd] Fix latent bug in WorkQueue --- contrib/pzstd/utils/WorkQueue.h | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/contrib/pzstd/utils/WorkQueue.h b/contrib/pzstd/utils/WorkQueue.h index 538213500..c46e6cbcf 100644 --- a/contrib/pzstd/utils/WorkQueue.h +++ b/contrib/pzstd/utils/WorkQueue.h @@ -28,6 +28,7 @@ class WorkQueue { std::mutex mutex_; std::condition_variable readerCv_; std::condition_variable writerCv_; + std::condition_variable finishCv_; std::queue queue_; bool done_; @@ -124,19 +125,14 @@ class WorkQueue { } readerCv_.notify_all(); writerCv_.notify_all(); + finishCv_.notify_all(); } /// Blocks until `finish()` has been called (but the queue may not be empty). void waitUntilFinished() { std::unique_lock lock(mutex_); while (!done_) { - readerCv_.wait(lock); - // If we were woken by a push, we need to wake a thread waiting on pop(). - if (!done_) { - lock.unlock(); - readerCv_.notify_one(); - lock.lock(); - } + finishCv_.wait(lock); } } };