diff options
Diffstat (limited to 'cpp/src/qpid/broker/QueuePolicy.cpp')
| -rw-r--r-- | cpp/src/qpid/broker/QueuePolicy.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/cpp/src/qpid/broker/QueuePolicy.cpp b/cpp/src/qpid/broker/QueuePolicy.cpp index 5c945d2c7f..41a6709d27 100644 --- a/cpp/src/qpid/broker/QueuePolicy.cpp +++ b/cpp/src/qpid/broker/QueuePolicy.cpp @@ -20,6 +20,7 @@ */ #include "QueuePolicy.h" #include "Queue.h" +#include "qpid/Exception.h" #include "qpid/framing/FieldValue.h" #include "qpid/framing/reply_exceptions.h" #include "qpid/log/Statement.h" @@ -38,8 +39,23 @@ void QueuePolicy::enqueued(uint64_t _size) void QueuePolicy::dequeued(uint64_t _size) { - if (maxCount) --count; - if (maxSize) size -= _size; + //Note: underflow detection is not reliable in the face of + //concurrent updates (at present locking in Queue.cpp prevents + //these anyway); updates are atomic and are safe regardless. + if (maxCount) { + if (count.get() > 0) { + --count; + } else { + throw Exception(QPID_MSG("Attempted count underflow on dequeue(" << _size << "): " << *this)); + } + } + if (maxSize) { + if (_size > size.get()) { + throw Exception(QPID_MSG("Attempted size underflow on dequeue(" << _size << "): " << *this)); + } else { + size -= _size; + } + } } bool QueuePolicy::checkLimit(const QueuedMessage& m) |
