diff options
author | Gordon Sim <gsim@apache.org> | 2007-10-25 17:36:02 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2007-10-25 17:36:02 +0000 |
commit | 0df11f3cb1ab391f1e0d262b5f9fc29c4b421f3a (patch) | |
tree | ff8f2e0ca564e0cc0450f6cc2070e0a39cc9569f /qpid/cpp/src | |
parent | d19dba750cc4efcdaaad4f9037eb65d4f3467164 (diff) | |
download | qpid-python-0df11f3cb1ab391f1e0d262b5f9fc29c4b421f3a.tar.gz |
Fixes to handling of non-acquired subscribers
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@588286 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r-- | qpid/cpp/src/qpid/broker/Queue.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/qpid/cpp/src/qpid/broker/Queue.cpp b/qpid/cpp/src/qpid/broker/Queue.cpp index 2444684d7e..ef1358feb9 100644 --- a/qpid/cpp/src/qpid/broker/Queue.cpp +++ b/qpid/cpp/src/qpid/broker/Queue.cpp @@ -252,11 +252,16 @@ void Queue::serviceBrowser(Consumer::ptr browser) bool Queue::seek(QueuedMessage& msg, const framing::SequenceNumber& position) { Mutex::ScopedLock locker(messageLock); if (!messages.empty() && messages.back().position > position) { - uint index = (position - messages.front().position) + 1; - if (index < messages.size()) { - msg = messages[index]; + if (position < messages.front().position) { + msg = messages.front(); return true; - } + } else { + uint index = (position - messages.front().position) + 1; + if (index < messages.size()) { + msg = messages[index]; + return true; + } + } } return false; } @@ -280,6 +285,12 @@ void Queue::consume(Consumer::ptr c, bool requestExclusive){ if (c->preAcquires()) { acquirers.push_back(c); } else { + Mutex::ScopedLock locker(messageLock); + if (messages.empty()) { + c->position = SequenceNumber(sequence.getValue() - 1); + } else { + c->position = SequenceNumber(messages.front().position.getValue() - 1); + } browsers.push_back(c); } } |