You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kp...@apache.org on 2011/04/08 15:59:43 UTC

svn commit: r1090252 - in /qpid/trunk/qpid/cpp/src/qpid/broker: Consumer.h QueueListeners.cpp QueueListeners.h

Author: kpvdr
Date: Fri Apr  8 13:59:42 2011
New Revision: 1090252

URL: http://svn.apache.org/viewvc?rev=1090252&view=rev
Log:
QPID-3191: A fix for the performance problem which replaces the QueueListeners std::vector with a std::deque and adds some other improvements.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/Consumer.h
    qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.h

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Consumer.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Consumer.h?rev=1090252&r1=1090251&r2=1090252&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Consumer.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Consumer.h Fri Apr  8 13:59:42 2011
@@ -29,15 +29,19 @@ namespace qpid {
 namespace broker {
 
 class Queue;
+class QueueListeners;
 
 class Consumer {
     const bool acquires;
+    // inListeners allows QueueListeners to efficiently track if this instance is registered
+    // for notifications without having to search its containers
+    bool inListeners;
   public:
     typedef boost::shared_ptr<Consumer> shared_ptr;            
     
     framing::SequenceNumber position;
     
-    Consumer(bool preAcquires = true) : acquires(preAcquires) {}
+    Consumer(bool preAcquires = true) : acquires(preAcquires), inListeners(false) {}
     bool preAcquires() const { return acquires; }
     virtual bool deliver(QueuedMessage& msg) = 0;
     virtual void notify() = 0;
@@ -45,6 +49,7 @@ class Consumer {
     virtual bool accept(boost::intrusive_ptr<Message>) { return true; }
     virtual OwnershipToken* getSession() = 0;
     virtual ~Consumer(){}
+    friend class QueueListeners;
 };
 
 }}

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.cpp?rev=1090252&r1=1090251&r2=1090252&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.cpp Fri Apr  8 13:59:42 2011
@@ -26,19 +26,25 @@ namespace broker {
 
 void QueueListeners::addListener(Consumer::shared_ptr c)
 {
-    if (c->preAcquires()) {
-        add(consumers, c);
-    } else {
-        add(browsers, c);
+    if (!c->inListeners) {
+        if (c->acquires) {
+            add(consumers, c);
+        } else {
+            add(browsers, c);
+        }
+        c->inListeners = true;
     }
 }
 
 void QueueListeners::removeListener(Consumer::shared_ptr c)
 {
-    if (c->preAcquires()) {
-        remove(consumers, c);
-    } else {
-        remove(browsers, c);
+    if (c->inListeners) {
+        if (c->acquires) {
+            remove(consumers, c);
+        } else {
+            remove(browsers, c);
+        }
+        c->inListeners = false;
     }
 }
 
@@ -46,18 +52,20 @@ void QueueListeners::populate(Notificati
 {
     if (consumers.size()) {
         set.consumer = consumers.front();
-        consumers.erase(consumers.begin());
+        consumers.pop_front();
+        set.consumer->inListeners = false;
     } else {
-        // Don't swap the vectors, hang on to the memory allocated.
+        // Don't swap the deques, hang on to the memory allocated.
         set.browsers = browsers;
         browsers.clear();
+        for (Listeners::iterator i = set.browsers.begin(); i != set.browsers.end(); i++)
+            (*i)->inListeners = false;
     }
 }
 
 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);
+    listeners.push_back(c);
 }
 
 void QueueListeners::remove(Listeners& listeners, Consumer::shared_ptr c)
@@ -73,9 +81,7 @@ void QueueListeners::NotificationSet::no
 }
 
 bool QueueListeners::contains(Consumer::shared_ptr c) const {
-    return
-        std::find(browsers.begin(), browsers.end(), c) != browsers.end() ||
-        std::find(consumers.begin(), consumers.end(), c) != consumers.end();
+    return c->inListeners;
 }
 
 void QueueListeners::ListenerSet::notifyAll()

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.h?rev=1090252&r1=1090251&r2=1090252&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/QueueListeners.h Fri Apr  8 13:59:42 2011
@@ -22,7 +22,7 @@
  *
  */
 #include "qpid/broker/Consumer.h"
-#include <vector>
+#include <deque>
 
 namespace qpid {
 namespace broker {
@@ -40,7 +40,7 @@ namespace broker {
 class QueueListeners
 {
   public:
-    typedef std::vector<Consumer::shared_ptr> Listeners;
+    typedef std::deque<Consumer::shared_ptr> Listeners;
 
     class NotificationSet
     {



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org