diff options
author | Alan Conway <aconway@apache.org> | 2011-08-05 20:52:37 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2011-08-05 20:52:37 +0000 |
commit | 2dda5290066f4e5b7ac07a80cbbe659b519a8200 (patch) | |
tree | 9ba6359ba7ee37c14e928cbc267a40b82c87b07c | |
parent | f0411b32b78e80892f291c44e083248eee8e4983 (diff) | |
download | qpid-python-2dda5290066f4e5b7ac07a80cbbe659b519a8200.tar.gz |
QPID-3399: Qpidd possible memory leaks
Replace vector with deque in PollableQueue. Under load the queue can
get long, and a vector, which allocates space in a single block, is a
memory hog. A deque will give and take memory in reasonable chunks as
the queue grows and shrinks.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1154377 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/src/qpid/sys/PollableQueue.h | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/qpid/cpp/src/qpid/sys/PollableQueue.h b/qpid/cpp/src/qpid/sys/PollableQueue.h index 81c2301c1e..03b9d0084d 100644 --- a/qpid/cpp/src/qpid/sys/PollableQueue.h +++ b/qpid/cpp/src/qpid/sys/PollableQueue.h @@ -10,9 +10,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -28,7 +28,8 @@ #include <boost/function.hpp> #include <boost/bind.hpp> #include <algorithm> -#include <vector> +#include <deque> +#include "qpid/log/Statement.h" // FIXME aconway 2011-08-05: namespace qpid { namespace sys { @@ -44,7 +45,7 @@ class Poller; template <class T> class PollableQueue { public: - typedef std::vector<T> Batch; + typedef std::deque<T> Batch; typedef T value_type; /** @@ -68,11 +69,11 @@ class PollableQueue { const boost::shared_ptr<sys::Poller>& poller); ~PollableQueue(); - + /** Push a value onto the queue. Thread safe */ void push(const T& t); - /** Start polling. */ + /** Start polling. */ void start(); /** Stop polling and wait for the current callback, if any, to complete. */ @@ -90,14 +91,14 @@ class PollableQueue { * ensure clean shutdown with no events left on the queue. */ void shutdown(); - + private: typedef sys::Monitor::ScopedLock ScopedLock; typedef sys::Monitor::ScopedUnlock ScopedUnlock; void dispatch(PollableCondition& cond); void process(); - + mutable sys::Monitor lock; Callback callback; PollableCondition condition; @@ -107,7 +108,7 @@ class PollableQueue { }; template <class T> PollableQueue<T>::PollableQueue( - const Callback& cb, const boost::shared_ptr<sys::Poller>& p) + const Callback& cb, const boost::shared_ptr<sys::Poller>& p) : callback(cb), condition(boost::bind(&PollableQueue<T>::dispatch, this, _1), p), stopped(true) @@ -151,7 +152,7 @@ template <class T> void PollableQueue<T>::process() { putBack = callback(batch); } // put back unprocessed items. - queue.insert(queue.begin(), putBack, typename Batch::const_iterator(batch.end())); + queue.insert(queue.begin(), putBack, typename Batch::const_iterator(batch.end())); batch.clear(); } } |