diff options
author | Carl C. Trieloff <cctrieloff@apache.org> | 2007-06-29 21:16:17 +0000 |
---|---|---|
committer | Carl C. Trieloff <cctrieloff@apache.org> | 2007-06-29 21:16:17 +0000 |
commit | c7b2714b6b6ad24da21e1956163e3f143457fa7f (patch) | |
tree | 5c0feb1f4596e3b4a0592282f2e31cc97c418dba /cpp/src/qpid/broker/AutoDelete.cpp | |
parent | a258bbcaf007d20d943669b7ee6223016dd08d66 (diff) | |
download | qpid-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.cpp | 43 |
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(); -} + |