diff options
| author | Gordon Sim <gsim@apache.org> | 2007-10-19 16:21:29 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2007-10-19 16:21:29 +0000 |
| commit | f33b0010633359c55e75c1005d38118cbaf1ea39 (patch) | |
| tree | 4c345cad660c9c62f0c3c68cac764e9a9f099c37 /cpp/src/qpid/broker/Queue.cpp | |
| parent | 01800d3b4d6346296dd4351eb441a75fa6d503e0 (diff) | |
| download | qpid-python-f33b0010633359c55e75c1005d38118cbaf1ea39.tar.gz | |
Fix to allocation algorithm in queue: prevents infinite loop when first consumer for allocation is cancelled after starting to dispatch a particular method.
Removed alarming(!) log statement.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@586519 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/Queue.cpp')
| -rw-r--r-- | cpp/src/qpid/broker/Queue.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp index 1dad0e1864..af248b8fae 100644 --- a/cpp/src/qpid/broker/Queue.cpp +++ b/cpp/src/qpid/broker/Queue.cpp @@ -154,16 +154,15 @@ Consumer::ptr Queue::allocate() bool Queue::dispatch(QueuedMessage& msg) { + //additions to the acquirers will result in a separate dispatch + //request, so won't result in anyone being missed + uint counter = getAcquirerCount(); Consumer::ptr c = allocate(); - Consumer::ptr first = c; - while(c){ + while(c && counter--){ if(c->deliver(msg)) { return true; } else { c = allocate(); - if (c == first) { - break; - } } } return false; @@ -194,6 +193,7 @@ void Queue::serviceAllBrowsers() Consumers copy; { RWlock::ScopedRlock locker(consumerLock); + if (browsers.empty()) return;//shortcut copy = browsers; } for (Consumers::iterator i = copy.begin(); i != copy.end(); i++) { @@ -312,6 +312,11 @@ uint32_t Queue::getConsumerCount() const{ return acquirers.size() + browsers.size(); } +uint32_t Queue::getAcquirerCount() const{ + RWlock::ScopedRlock locker(consumerLock); + return acquirers.size(); +} + bool Queue::canAutoDelete() const{ RWlock::ScopedRlock locker(consumerLock); return autodelete && acquirers.empty() && browsers.empty(); |
