diff options
author | Alan Conway <aconway@apache.org> | 2009-06-12 20:42:16 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2009-06-12 20:42:16 +0000 |
commit | 047bddbcc99dee7dfe7ebf53209a36ba8c3bb01b (patch) | |
tree | 9b0c938ddc443d830c61a9842c8f56002c2d23a9 | |
parent | c4c998e4b198b4d056a623a5e980985fa9fa9ac0 (diff) | |
download | qpid-python-047bddbcc99dee7dfe7ebf53209a36ba8c3bb01b.tar.gz |
Revert bad optimization: unpredictable ordering of set caused cluster failures.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@784267 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | cpp/src/qpid/broker/QueueListeners.cpp | 26 | ||||
-rw-r--r-- | cpp/src/qpid/broker/QueueListeners.h | 8 |
2 files changed, 25 insertions, 9 deletions
diff --git a/cpp/src/qpid/broker/QueueListeners.cpp b/cpp/src/qpid/broker/QueueListeners.cpp index 5b2c898294..7baca7d0f4 100644 --- a/cpp/src/qpid/broker/QueueListeners.cpp +++ b/cpp/src/qpid/broker/QueueListeners.cpp @@ -27,31 +27,43 @@ namespace broker { void QueueListeners::addListener(Consumer::shared_ptr c) { if (c->preAcquires()) { - consumers.insert(c); + add(consumers, c); } else { - browsers.insert(c); + add(browsers, c); } } void QueueListeners::removeListener(Consumer::shared_ptr c) { if (c->preAcquires()) { - consumers.erase(c); + remove(consumers, c); } else { - browsers.erase(c); + remove(browsers, c); } } void QueueListeners::populate(NotificationSet& set) { - if (!consumers.empty()) { - set.consumer = *consumers.begin(); - consumers.erase(consumers.begin()); + if (consumers.size()) { + set.consumer = consumers.front(); + consumers.pop_front(); } else { browsers.swap(set.browsers); } } +void QueueListeners::add(Listeners& listeners, Consumer::shared_ptr c) +{ + Listeners::iterator i = std::find(listeners.begin(), listeners.end(), c); + if (i == listeners.end()) listeners.push_back(c); +} + +void QueueListeners::remove(Listeners& listeners, Consumer::shared_ptr c) +{ + Listeners::iterator i = std::find(listeners.begin(), listeners.end(), c); + if (i != listeners.end()) listeners.erase(i); +} + void QueueListeners::NotificationSet::notify() { if (consumer) consumer->notify(); diff --git a/cpp/src/qpid/broker/QueueListeners.h b/cpp/src/qpid/broker/QueueListeners.h index 509f1be6f3..53ed6a17e4 100644 --- a/cpp/src/qpid/broker/QueueListeners.h +++ b/cpp/src/qpid/broker/QueueListeners.h @@ -22,7 +22,7 @@ * */ #include "Consumer.h" -#include <set> +#include <list> namespace qpid { namespace broker { @@ -40,7 +40,7 @@ namespace broker { class QueueListeners { public: - typedef std::set<Consumer::shared_ptr> Listeners; + typedef std::list<Consumer::shared_ptr> Listeners; class NotificationSet { @@ -58,6 +58,10 @@ class QueueListeners private: Listeners consumers; Listeners browsers; + + void add(Listeners&, Consumer::shared_ptr); + void remove(Listeners&, Consumer::shared_ptr); + }; }} // namespace qpid::broker |