/*
- * DEBUG: section 77 Delay Pools
- * AUTHOR: Robert Collins <robertc@squid-cache.org>
- * Based upon original delay pools code by
- * David Luyer <david@luyer.net>
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
*
- * SQUID Web Proxy Cache http://www.squid-cache.org/
- * ----------------------------------------------------------
- *
- * Squid is the result of efforts by numerous individuals from
- * the Internet community; see the CONTRIBUTORS file for full
- * details. Many organizations have provided support for Squid's
- * development; see the SPONSORS file for full details. Squid is
- * Copyrighted (C) 2001 by the Regents of the University of
- * California; see the COPYRIGHT file for full details. Squid
- * incorporates software developed and/or copyrighted by other
- * sources; see the CREDITS file for full details.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
- *
- *
- * Copyright (c) 2003, Robert Collins <robertc@squid-cache.org>
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
*/
+/* DEBUG: section 77 Delay Pools */
+
/**
\defgroup DelayPoolsInternal Delay Pools Internal
\ingroup DelayPoolsAPI
#include "squid.h"
#if USE_DELAY_POOLS
-#include "Array.h"
#include "client_side_request.h"
#include "comm/Connection.h"
#include "CommonPool.h"
#include "DelayUser.h"
#include "DelayVector.h"
#include "event.h"
+#include "http/Stream.h"
#include "ip/Address.h"
#include "MemObject.h"
#include "mgr/Registration.h"
#include "NullDelayId.h"
#include "SquidString.h"
#include "SquidTime.h"
-#include "StoreClient.h"
#include "Store.h"
-
-/// \ingroup DelayPoolsInternal
-long DelayPools::MemoryUsed = 0;
+#include "StoreClient.h"
/// \ingroup DelayPoolsInternal
class Aggregate : public CompositePoolNode
{
+ MEMPROXY_CLASS(Aggregate);
public:
typedef RefCount<Aggregate> Pointer;
- void *operator new(size_t);
- void operator delete (void *);
Aggregate();
~Aggregate();
virtual DelaySpec *rate() {return &spec;}
/// \ingroup DelayPoolsInternal
class AggregateId:public DelayIdComposite
{
+ MEMPROXY_CLASS(Aggregate::AggregateId);
public:
- void *operator new(size_t);
- void operator delete (void *);
AggregateId (RefCount<Aggregate>);
virtual int bytesWanted (int min, int max) const;
virtual void bytesIn(int qty);
/// \ingroup DelayPoolsInternal
class VectorPool : public CompositePoolNode
{
+ MEMPROXY_CLASS(VectorPool);
public:
typedef RefCount<VectorPool> Pointer;
/// \ingroup DelayPoolsInternal
class Id:public DelayIdComposite
{
+ MEMPROXY_CLASS(VectorPool::Id);
public:
- void *operator new(size_t);
- void operator delete (void *);
Id (RefCount<VectorPool>, int);
virtual int bytesWanted (int min, int max) const;
virtual void bytesIn(int qty);
/// \ingroup DelayPoolsInternal
class IndividualPool : public VectorPool
{
-
-public:
- void *operator new(size_t);
- void operator delete(void *);
+ MEMPROXY_CLASS(IndividualPool);
protected:
virtual char const *label() const {return "Individual";}
/// \ingroup DelayPoolsInternal
class ClassCNetPool : public VectorPool
{
-
-public:
- void *operator new(size_t);
- void operator delete (void *);
+ MEMPROXY_CLASS(ClassCNetPool);
protected:
virtual char const *label() const {return "Network";}
/// \ingroup DelayPoolsInternal
class ClassCHostPool : public CompositePoolNode
{
+ MEMPROXY_CLASS(ClassCHostPool);
public:
typedef RefCount<ClassCHostPool> Pointer;
/// \ingroup DelayPoolsInternal
class Id:public DelayIdComposite
{
+ MEMPROXY_CLASS(ClassCHostPool::Id);
public:
- void *operator new(size_t);
- void operator delete (void *);
Id (RefCount<ClassCHostPool>, unsigned char, unsigned char);
virtual int bytesWanted (int min, int max) const;
virtual void bytesIn(int qty);
theAggregate->delayRead(aRead);
}
-void *
-CommonPool::operator new(size_t size)
-{
- DelayPools::MemoryUsed += sizeof (CommonPool);
- return ::operator new (size);
-}
-
-void
-CommonPool::operator delete(void *address)
-{
- DelayPools::MemoryUsed -= sizeof(CommonPool);
- ::operator delete(address);
-}
-
CommonPool *
CommonPool::Factory(unsigned char _class, CompositePoolNode::Pointer& compositeCopy)
{
individuals.values[newIndex].init (rate);
}
-void *
-CompositePoolNode::operator new(size_t size)
-{
- DelayPools::MemoryUsed += sizeof (CompositePoolNode);
- return ::operator new (size);
-}
-
-void
-CompositePoolNode::operator delete (void *address)
-{
- DelayPools::MemoryUsed -= sizeof (CompositePoolNode);
- ::operator delete (address);
-}
-
-void *
-Aggregate::operator new(size_t size)
-{
- DelayPools::MemoryUsed += sizeof (Aggregate);
- return ::operator new (size);
-}
-
-void
-Aggregate::operator delete (void *address)
-{
- DelayPools::MemoryUsed -= sizeof (Aggregate);
- ::operator delete (address);
-}
-
Aggregate::Aggregate()
{
theBucket.init (*rate());
return new NullDelayId;
}
-void *
-Aggregate::AggregateId::operator new(size_t size)
-{
- DelayPools::MemoryUsed += sizeof (AggregateId);
- return ::operator new (size);
-}
-
-void
-Aggregate::AggregateId::operator delete (void *address)
-{
- DelayPools::MemoryUsed -= sizeof (AggregateId);
- ::operator delete (address);
-}
-
Aggregate::AggregateId::AggregateId(RefCount<Aggregate> anAggregate) : theAggregate(anAggregate)
{}
DelayPools::delay_data = new DelayPool[pools()];
- DelayPools::MemoryUsed += pools() * sizeof(DelayPool);
-
eventAdd("DelayPools::Update", DelayPools::Update, NULL, 1.0, 1);
}
{
eventDelete(DelayPools::Update, NULL);
delete[] DelayPools::delay_data;
- DelayPools::MemoryUsed -= pools() * sizeof(*DelayPools::delay_data);
pools_ = 0;
}
LastUpdate = squid_curtime;
- Vector<Updateable *>::iterator pos = toUpdate.begin();
+ std::vector<Updateable *>::iterator pos = toUpdate.begin();
while (pos != toUpdate.end()) {
(*pos)->update(incr);
void
DelayPools::deregisterForUpdates (Updateable *anObject)
{
- Vector<Updateable *>::iterator pos = toUpdate.begin();
+ std::vector<Updateable *>::iterator pos = toUpdate.begin();
while (pos != toUpdate.end() && *pos != anObject) {
++pos;
if (pos != toUpdate.end()) {
/* move all objects down one */
- Vector<Updateable *>::iterator temp = pos;
+ std::vector<Updateable *>::iterator temp = pos;
++pos;
while (pos != toUpdate.end()) {
}
}
-Vector<Updateable *> DelayPools::toUpdate;
+std::vector<Updateable *> DelayPools::toUpdate;
void
DelayPools::Stats(StoreEntry * sentry)
{
- unsigned short i;
-
storeAppendPrintf(sentry, "Delay pools configured: %d\n\n", DelayPools::pools());
- for (i = 0; i < DelayPools::pools(); ++i) {
+ for (unsigned short i = 0; i < DelayPools::pools(); ++i) {
if (DelayPools::delay_data[i].theComposite().getRaw()) {
storeAppendPrintf(sentry, "Pool: %d\n\tClass: %s\n\n", i + 1, DelayPools::delay_data[i].pool->theClassTypeLabel());
DelayPools::delay_data[i].theComposite()->stats (sentry);
} else
storeAppendPrintf(sentry, "\tMisconfigured pool.\n\n");
}
-
- storeAppendPrintf(sentry, "Memory Used: %d bytes\n", (int) DelayPools::MemoryUsed);
}
void
return index;
}
-void *
-IndividualPool::operator new(size_t size)
-{
- DelayPools::MemoryUsed += sizeof (IndividualPool);
- return ::operator new (size);
-}
-
-void
-IndividualPool::operator delete (void *address)
-{
- DelayPools::MemoryUsed -= sizeof (IndividualPool);
- ::operator delete (address);
-}
-
VectorPool::VectorPool()
{
DelayPools::registerForUpdates (this);
return new NullDelayId;
/* non-IPv4 are not able to provide IPv4-bitmask for this pool type key. */
- if ( !details.src_addr.IsIPv4() )
+ if ( !details.src_addr.isIPv4() )
return new NullDelayId;
unsigned int key = makeKey(details.src_addr);
return new Id(this, resultIndex);
}
-void *
-VectorPool::Id::operator new(size_t size)
-{
- DelayPools::MemoryUsed += sizeof (Id);
- return ::operator new (size);
-}
-
-void
-VectorPool::Id::operator delete(void *address)
-{
- DelayPools::MemoryUsed -= sizeof (Id);
- ::operator delete (address);
-}
-
VectorPool::Id::Id(VectorPool::Pointer aPool, int anIndex) : theVector (aPool), theIndex (anIndex)
{}
IndividualPool::makeKey(Ip::Address &src_addr) const
{
/* IPv4 required for this pool */
- if ( !src_addr.IsIPv4() )
+ if ( !src_addr.isIPv4() )
return 1;
struct in_addr host;
- src_addr.GetInAddr(host);
+ src_addr.getInAddr(host);
return (ntohl(host.s_addr) & 0xff);
}
-void *
-ClassCNetPool::operator new(size_t size)
-{
- DelayPools::MemoryUsed += sizeof (ClassCNetPool);
- return ::operator new (size);
-}
-
-void
-ClassCNetPool::operator delete (void *address)
-{
- DelayPools::MemoryUsed -= sizeof (ClassCNetPool);
- ::operator delete (address);
-}
-
unsigned int
ClassCNetPool::makeKey(Ip::Address &src_addr) const
{
/* IPv4 required for this pool */
- if ( !src_addr.IsIPv4() )
+ if ( !src_addr.isIPv4() )
return 1;
struct in_addr net;
- src_addr.GetInAddr(net);
+ src_addr.getInAddr(net);
return ( (ntohl(net.s_addr) >> 8) & 0xff);
}
ClassCHostPool::makeHostKey(Ip::Address &src_addr) const
{
/* IPv4 required for this pool */
- if ( !src_addr.IsIPv4() )
+ if ( !src_addr.isIPv4() )
return 1;
/* Temporary bypass for IPv4-only */
struct in_addr host;
- src_addr.GetInAddr(host);
+ src_addr.getInAddr(host);
return (ntohl(host.s_addr) & 0xff);
}
ClassCHostPool::makeKey(Ip::Address &src_addr) const
{
/* IPv4 required for this pool */
- if ( !src_addr.IsIPv4() )
+ if ( !src_addr.isIPv4() )
return 1;
struct in_addr net;
- src_addr.GetInAddr(net);
+ src_addr.getInAddr(net);
return ( (ntohl(net.s_addr) >> 8) & 0xff);
}
return new NullDelayId;
/* non-IPv4 are not able to provide IPv4-bitmask for this pool type key. */
- if ( !details.src_addr.IsIPv4() )
+ if ( !details.src_addr.isIPv4() )
return new NullDelayId;
unsigned int key = makeKey (details.src_addr);
return new Id (this, netIndex, hostIndex);
}
-void *
-ClassCHostPool::Id::operator new(size_t size)
-{
- DelayPools::MemoryUsed += sizeof (Id);
- return ::operator new (size);
-}
-
-void
-ClassCHostPool::Id::operator delete (void *address)
-{
- DelayPools::MemoryUsed -= sizeof (Id);
- ::operator delete (address);
-}
-
ClassCHostPool::Id::Id (ClassCHostPool::Pointer aPool, unsigned char aNet, unsigned char aHost) : theClassCHost (aPool), theNet (aNet), theHost (aHost)
{}
}
#endif /* USE_DELAY_POOLS */
+