From 0d0ed1256b5c7fafa86de4ea75d29bbc5b16d12e Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 14 Apr 2013 12:24:28 +0200 Subject: [PATCH] Add safety check in prio work queue --- thread/prioritizedworkqueue.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/thread/prioritizedworkqueue.cpp b/thread/prioritizedworkqueue.cpp index a8ec8cc05c..82742e058d 100644 --- a/thread/prioritizedworkqueue.cpp +++ b/thread/prioritizedworkqueue.cpp @@ -48,8 +48,10 @@ PrioritizedWorkQueueItem *PrioritizedWorkQueue::Pop() { mutex_.lock(); while (queue_.empty()) { notEmpty_.wait(mutex_); - if (done_) + if (done_) { + mutex_.unlock(); return 0; + } } // Find the top priority item (lowest value). @@ -61,10 +63,17 @@ PrioritizedWorkQueueItem *PrioritizedWorkQueue::Pop() { best_prio = (*iter)->priority(); } } - PrioritizedWorkQueueItem *poppedItem = *best; - queue_.erase(best); - mutex_.unlock(); - return poppedItem; + + if (best != queue_.end()) { + PrioritizedWorkQueueItem *poppedItem = *best; + queue_.erase(best); + mutex_.unlock(); + return poppedItem; + } else { + // Not really sure how this can happen, but let's be safe. + mutex_.unlock(); + return 0; + } } // TODO: This feels ugly. Revisit later.