From 1b5c59db75ea735c9a97b71e2abb17ce809b2372 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 13 Oct 2013 11:59:43 -0700 Subject: [PATCH] Correctly exit work queue on done, race condition fix. done_ might've been set to true while processing the item, making the wait wait forever. --- thread/prioritizedworkqueue.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thread/prioritizedworkqueue.cpp b/thread/prioritizedworkqueue.cpp index 18369ed617..e2b3e7ef09 100644 --- a/thread/prioritizedworkqueue.cpp +++ b/thread/prioritizedworkqueue.cpp @@ -12,8 +12,8 @@ PrioritizedWorkQueue::~PrioritizedWorkQueue() { void PrioritizedWorkQueue::Add(PrioritizedWorkQueueItem *item) { mutex_.lock(); queue_.push_back(item); - mutex_.unlock(); notEmpty_.notify_one(); + mutex_.unlock(); } void PrioritizedWorkQueue::Stop() { @@ -38,7 +38,7 @@ void PrioritizedWorkQueue::Flush() { // The worker should simply call this in a loop. Will block when appropriate. PrioritizedWorkQueueItem *PrioritizedWorkQueue::Pop() { mutex_.lock(); - while (queue_.empty()) { + while (queue_.empty() && !done_) { notEmpty_.wait(mutex_); if (done_) { mutex_.unlock();