diff options
Diffstat (limited to 'cpp/src/qpid/sys')
| -rw-r--r-- | cpp/src/qpid/sys/BlockingQueue.h | 6 | ||||
| -rw-r--r-- | cpp/src/qpid/sys/Waitable.h | 3 |
2 files changed, 8 insertions, 1 deletions
diff --git a/cpp/src/qpid/sys/BlockingQueue.h b/cpp/src/qpid/sys/BlockingQueue.h index 210cb4ad82..ca6b529930 100644 --- a/cpp/src/qpid/sys/BlockingQueue.h +++ b/cpp/src/qpid/sys/BlockingQueue.h @@ -53,9 +53,13 @@ public: Waitable::ScopedWait w(waitable); if (timeout == TIME_INFINITE) { while (queue.empty()) waitable.wait(); - } else { + } else if (timeout) { AbsTime deadline(now(),timeout); while (queue.empty() && deadline > now()) waitable.wait(deadline); + } else { + //ensure zero timeout pop does not miss the fact that + //queue is closed + waitable.checkException(); } } if (queue.empty()) return false; diff --git a/cpp/src/qpid/sys/Waitable.h b/cpp/src/qpid/sys/Waitable.h index 7701b6f97d..8f6bd17049 100644 --- a/cpp/src/qpid/sys/Waitable.h +++ b/cpp/src/qpid/sys/Waitable.h @@ -79,6 +79,9 @@ class Waitable : public Monitor { /** True if the waitable has an exception */ bool hasException() const { return exception; } + /** Throws if the waitable has an exception */ + void checkException() const { exception.raise(); } + /** Clear the exception if any */ void resetException() { exception.reset(); } |
