summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2010-06-22 15:42:35 +0000
committerGordon Sim <gsim@apache.org>2010-06-22 15:42:35 +0000
commit1a85afb37de55697e172acd001db98dd9b4722a1 (patch)
treeb85f98a8aad017ee8c4aa812dbfac999e33c7852 /qpid/cpp/src
parentb3c9cdb55d0c0f054bc4329f51492c0bee001ada (diff)
downloadqpid-python-1a85afb37de55697e172acd001db98dd9b4722a1.tar.gz
Don't hold QueueRegistry lock while iterating over queues to purge them of expired messages.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@956923 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/qpid/broker/QueueCleaner.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/qpid/cpp/src/qpid/broker/QueueCleaner.cpp b/qpid/cpp/src/qpid/broker/QueueCleaner.cpp
index c80fe89035..ed98468490 100644
--- a/qpid/cpp/src/qpid/broker/QueueCleaner.cpp
+++ b/qpid/cpp/src/qpid/broker/QueueCleaner.cpp
@@ -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);
}