summaryrefslogtreecommitdiff
path: root/qpid/cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2008-10-13 18:46:32 +0000
committerGordon Sim <gsim@apache.org>2008-10-13 18:46:32 +0000
commit687bd1074ebe8e88c2cbaf18db952b0b8573c820 (patch)
treef8f80d38b19c62c6b0f32bf7bfacc5a4d0c50108 /qpid/cpp
parentcd0871c744a4014ed612180ca193e013d8ceead6 (diff)
downloadqpid-python-687bd1074ebe8e88c2cbaf18db952b0b8573c820.tar.gz
Reduce the scope over which lock is held during purge of expired messages.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@704199 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp')
-rw-r--r--qpid/cpp/src/qpid/broker/Queue.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/qpid/cpp/src/qpid/broker/Queue.cpp b/qpid/cpp/src/qpid/broker/Queue.cpp
index ccd7c1fa3e..e608ef270b 100644
--- a/qpid/cpp/src/qpid/broker/Queue.cpp
+++ b/qpid/cpp/src/qpid/broker/Queue.cpp
@@ -405,15 +405,19 @@ QueuedMessage Queue::get(){
void Queue::purgeExpired()
{
- Mutex::ScopedLock locker(messageLock);
- for (Messages::iterator i = messages.begin(); i != messages.end(); ) {
- if (i->payload->hasExpired()) {
- dequeue(0, *i);
- i = messages.erase(i);
- } else {
- ++i;
+ Messages expired;
+ {
+ Mutex::ScopedLock locker(messageLock);
+ for (Messages::iterator i = messages.begin(); i != messages.end();) {
+ if (i->payload->hasExpired()) {
+ expired.push_back(*i);
+ i = messages.erase(i);
+ } else {
+ ++i;
+ }
}
- }
+ }
+ for_each(expired.begin(), expired.end(), bind(&Queue::dequeue, this, (TransactionContext*) 0, _1));
}
/**