From 04ee94c3acc0f2240af0eb39f037d7bf096c019d Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Fri, 5 Aug 2011 20:52:37 +0000 Subject: 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/qpid@1154377 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/sys/PollableQueue.h | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'cpp') diff --git a/cpp/src/qpid/sys/PollableQueue.h b/cpp/src/qpid/sys/PollableQueue.h index 81c2301c1e..03b9d0084d 100644 --- a/cpp/src/qpid/sys/PollableQueue.h +++ b/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 #include #include -#include +#include +#include "qpid/log/Statement.h" // FIXME aconway 2011-08-05: namespace qpid { namespace sys { @@ -44,7 +45,7 @@ class Poller; template class PollableQueue { public: - typedef std::vector Batch; + typedef std::deque Batch; typedef T value_type; /** @@ -68,11 +69,11 @@ class PollableQueue { const boost::shared_ptr& 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 PollableQueue::PollableQueue( - const Callback& cb, const boost::shared_ptr& p) + const Callback& cb, const boost::shared_ptr& p) : callback(cb), condition(boost::bind(&PollableQueue::dispatch, this, _1), p), stopped(true) @@ -151,7 +152,7 @@ template void PollableQueue::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(); } } -- cgit v1.2.1