summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker/AutoDelete.cpp
diff options
context:
space:
mode:
authorCarl C. Trieloff <cctrieloff@apache.org>2007-06-29 21:16:17 +0000
committerCarl C. Trieloff <cctrieloff@apache.org>2007-06-29 21:16:17 +0000
commitc7b2714b6b6ad24da21e1956163e3f143457fa7f (patch)
tree5c0feb1f4596e3b4a0592282f2e31cc97c418dba /cpp/src/qpid/broker/AutoDelete.cpp
parenta258bbcaf007d20d943669b7ee6223016dd08d66 (diff)
downloadqpid-python-c7b2714b6b6ad24da21e1956163e3f143457fa7f.tar.gz
Updated AutoDelete, now only run when auto delete queues exist and
additional auto delete queues being declared. cuts 1-3% of CPU time for concurrent publisher run. Could do with some more auto delete tests... git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@552037 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/AutoDelete.cpp')
-rw-r--r--cpp/src/qpid/broker/AutoDelete.cpp43
1 files changed, 15 insertions, 28 deletions
diff --git a/cpp/src/qpid/broker/AutoDelete.cpp b/cpp/src/qpid/broker/AutoDelete.cpp
index 45ce12c036..6fa3bfbebf 100644
--- a/cpp/src/qpid/broker/AutoDelete.cpp
+++ b/cpp/src/qpid/broker/AutoDelete.cpp
@@ -25,12 +25,12 @@
using namespace qpid::broker;
using namespace qpid::sys;
-AutoDelete::AutoDelete(QueueRegistry* const _registry, uint32_t _period)
- : registry(_registry), period(_period*TIME_MSEC), stopped(true) { }
+AutoDelete::AutoDelete(QueueRegistry* const _registry, uint32_t _water_mark)
+ : registry(_registry), high_water_mark(_water_mark), water_mark(0) { }
void AutoDelete::add(Queue::shared_ptr const queue){
- Mutex::ScopedLock l(lock);
- queues.push(queue);
+ Mutex::ScopedLock l(lock);
+ queues.push(queue);
}
Queue::shared_ptr const AutoDelete::pop(){
@@ -43,7 +43,15 @@ Queue::shared_ptr const AutoDelete::pop(){
return next;
}
-void AutoDelete::process(){
+void AutoDelete::clean(){
+ if (water_mark++ < high_water_mark)
+ return;
+ water_mark =0;
+ cleanNow();
+}
+
+
+void AutoDelete::cleanNow(){
Queue::shared_ptr seen;
for(Queue::shared_ptr q = pop(); q; q = pop()){
if(seen == q){
@@ -58,30 +66,9 @@ void AutoDelete::process(){
if(!seen) seen = q;
}
}
+
}
-void AutoDelete::run(){
- Monitor::ScopedLock l(monitor);
- while(!stopped){
- process();
- monitor.wait(AbsTime(now(), period));
- }
-}
-void AutoDelete::start(){
- Monitor::ScopedLock l(monitor);
- if(stopped){
- stopped = false;
- runner = Thread(this);
- }
-}
-void AutoDelete::stop(){
- {
- Monitor::ScopedLock l(monitor);
- if(stopped) return;
- stopped = true;
- }
- monitor.notify();
- runner.join();
-}
+