diff options
-rw-r--r-- | qpid/cpp/src/qpid/broker/QueueListeners.cpp | 26 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/broker/QueueListeners.h | 8 |
2 files changed, 25 insertions, 9 deletions
diff --git a/qpid/cpp/src/qpid/broker/QueueListeners.cpp b/qpid/cpp/src/qpid/broker/QueueListeners.cpp index 5b2c898294..7baca7d0f4 100644 --- a/qpid/cpp/src/qpid/broker/QueueListeners.cpp +++ b/qpid/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/qpid/cpp/src/qpid/broker/QueueListeners.h b/qpid/cpp/src/qpid/broker/QueueListeners.h index 509f1be6f3..53ed6a17e4 100644 --- a/qpid/cpp/src/qpid/broker/QueueListeners.h +++ b/qpid/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 |