You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2010/06/22 17:42:35 UTC

svn commit: r956923 - /qpid/trunk/qpid/cpp/src/qpid/broker/QueueCleaner.cpp

Author: gsim
Date: Tue Jun 22 15:42:35 2010
New Revision: 956923

URL: http://svn.apache.org/viewvc?rev=956923&view=rev
Log:
Don't hold QueueRegistry lock while iterating over queues to purge them of expired messages.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/QueueCleaner.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/QueueCleaner.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/QueueCleaner.cpp?rev=956923&r1=956922&r2=956923&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/QueueCleaner.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/QueueCleaner.cpp Tue Jun 22 15:42:35 2010
@@ -46,9 +46,25 @@ void QueueCleaner::Task::fire()
     parent.fired();
 }
 
+namespace {
+struct CollectQueues
+{
+    std::vector<Queue::shared_ptr>* queues;
+    CollectQueues(std::vector<Queue::shared_ptr>* q) : queues(q) {}
+    void operator()(Queue::shared_ptr q)
+    {
+        queues->push_back(q);
+    }
+};
+}
+
 void QueueCleaner::fired()
 {
-    queues.eachQueue(boost::bind(&Queue::purgeExpired, _1));
+    //collect copy of list of queues to avoid holding registry lock while we perform purge
+    std::vector<Queue::shared_ptr> copy;
+    CollectQueues collect(&copy);
+    queues.eachQueue(collect);
+    std::for_each(copy.begin(), copy.end(), boost::bind(&Queue::purgeExpired, _1));
     task->setupNextFire();
     timer.add(task);
 }



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