summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2013-01-31 19:43:40 +0000
committerAlan Conway <aconway@apache.org>2013-01-31 19:43:40 +0000
commit23880661d6e82428620ebecc22762db225bee48d (patch)
tree983fe07b657308cb0ded237cd187de99c789750d /cpp
parent666313e38484b8a50a47a808afe2e275dfe79ff0 (diff)
downloadqpid-python-23880661d6e82428620ebecc22762db225bee48d.tar.gz
QPID-4555: Fix handling of no-credit consumers in Queue::getNextMessage.
This was discovered while investigating QPID-4555 but could affect any consumer using bounded credt. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1441163 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/qpid/broker/Consumer.h2
-rw-r--r--cpp/src/qpid/broker/Queue.cpp4
2 files changed, 5 insertions, 1 deletions
diff --git a/cpp/src/qpid/broker/Consumer.h b/cpp/src/qpid/broker/Consumer.h
index d21dbb19f0..662b0f937d 100644
--- a/cpp/src/qpid/broker/Consumer.h
+++ b/cpp/src/qpid/broker/Consumer.h
@@ -86,6 +86,8 @@ class Consumer : public QueueCursor {
*/
virtual bool isCounted() { return true; }
+ QueueCursor getCursor() const { return *this; }
+ void setCursor(const QueueCursor& qc) { static_cast<QueueCursor&>(*this) = qc; }
protected:
//framing::SequenceNumber position;
diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp
index 9a0e4a96f4..81e26d0b48 100644
--- a/cpp/src/qpid/broker/Queue.cpp
+++ b/cpp/src/qpid/broker/Queue.cpp
@@ -366,7 +366,8 @@ bool Queue::getNextMessage(Message& m, Consumer::shared_ptr& c)
while (true) {
//TODO: reduce lock scope
Mutex::ScopedLock locker(messageLock);
- Message* msg = messages->next(*c);
+ QueueCursor cursor = c->getCursor(); // Save current position.
+ Message* msg = messages->next(*c); // Advances c.
if (msg) {
if (msg->hasExpired()) {
QPID_LOG(debug, "Message expired from queue '" << name << "'");
@@ -405,6 +406,7 @@ bool Queue::getNextMessage(Message& m, Consumer::shared_ptr& c)
} else {
//message(s) are available but consumer hasn't got enough credit
QPID_LOG(debug, "Consumer can't currently accept message from '" << name << "'");
+ c->setCursor(cursor); // Restore cursor, will try again with credit
if (c->preAcquires()) {
//let someone else try
listeners.populate(set);