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(©);
+ 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