tests/stub_libcomm.cc \
tests/stub_liberror.cc \
tests/stub_libformat.cc \
+ tests/stub_libmem.cc \
tests/stub_libmgr.cc \
tests/stub_libsecurity.cc \
tests/stub_libsslsquid.cc \
ip/libip.la \
base/libbase.la \
ipc/libipc.la \
- mem/libmem.la \
sbuf/libsbuf.la \
$(top_builddir)/lib/libmisccontainers.la \
$(top_builddir)/lib/libmiscencoding.la \
CpuAffinityReconfigure();
setUmask(Config.umask);
- Mem::Report();
setEffectiveUser();
Debug::UseCacheLog();
ipcache_restart(); /* clear stuck entries */
parse_err = 1;
}
- Mem::Report();
-
if (opt_parse_cfg_only || parse_err > 0)
return parse_err;
}
return pool;
}
-void
-MemPools::setIdleLimit(ssize_t new_idle_limit)
-{
- mem_idle_limit = new_idle_limit;
-}
-
-ssize_t
-MemPools::idleLimit() const
-{
- return mem_idle_limit;
-}
-
/* Change the default value of defaultIsChunked to override
* all pools - including those used before main() starts where
* MemPools::GetInstance().setDefaultPoolChunking() can be called.
{
assert(obj != nullptr);
(void) VALGRIND_CHECK_MEM_IS_ADDRESSABLE(obj, obj_size);
- deallocate(obj, MemPools::GetInstance().mem_idle_limit == 0);
+ deallocate(obj, MemPools::GetInstance().idleLimit() == 0);
++free_calls;
}
MemPools::clean(time_t maxage)
{
flushMeters();
- if (mem_idle_limit < 0) // no limit to enforce
+ if (idleLimit() < 0) // no limit to enforce
return;
int shift = 1;
- if (TheMeter.idle.currentLevel() > mem_idle_limit)
+ if (TheMeter.idle.currentLevel() > idleLimit())
maxage = shift = 0;
MemImplementingAllocator *pool;
stats->tot_items_idle = pp_stats.items_idle;
stats->tot_overhead += pp_stats.overhead + MemPools::GetInstance().poolCount * sizeof(MemAllocator *);
- stats->mem_idle_limit = MemPools::GetInstance().mem_idle_limit;
+ stats->mem_idle_limit = MemPools::GetInstance().idleLimit();
return pools_inuse;
}
/**
* Sets upper limit in bytes to amount of free ram kept in pools. This is
* not strict upper limit, but a hint. When MemPools are over this limit,
- * totally free chunks are immediately considered for release. Otherwise
- * only chunks that have not been referenced for a long time are checked.
+ * deallocate attempts to release memory to the system instead of pooling.
*/
- void setIdleLimit(ssize_t new_idle_limit);
- ssize_t idleLimit() const;
+ void setIdleLimit(const ssize_t newLimit) { idleLimit_ = newLimit; }
+ /// \copydoc idleLimit_
+ ssize_t idleLimit() const { return idleLimit_; }
/**
\par
void setDefaultPoolChunking(bool const &);
MemImplementingAllocator *pools = nullptr;
- ssize_t mem_idle_limit = (2 << 20) /* 2MB */;
int poolCount = 0;
bool defaultIsChunked = false;
+
+private:
+ /// Limits the cumulative size of allocated (but unused) memory in all pools.
+ /// Initial value is 2MB until first configuration,
+ /// See squid.conf memory_pools_limit directive.
+ ssize_t idleLimit_ = (2 << 20);
};
/**
namespace Mem
{
void Init();
-void Report();
void Stats(StoreEntry *);
void CleanIdlePools(void *unused);
void Report(std::ostream &);
Mgr::RegisterAction("mem", "Memory Utilization", Mem::Stats, 0, 1);
}
-void
-Mem::Report()
-{
- debugs(13, 3, "Memory pools are '" <<
- (Config.onoff.mem_pools ? "on" : "off") << "'; limit: " <<
- std::setprecision(3) << toMB(MemPools::GetInstance().idleLimit()) <<
- " MB");
-}
-
static mem_type &
operator++(mem_type &aMem)
{
#include "mem/forward.h"
void Mem::Init() STUB_NOP
-void Mem::Report() STUB_NOP
void Mem::Stats(StoreEntry *) STUB_NOP
void Mem::CleanIdlePools(void *) STUB_NOP
void Mem::Report(std::ostream &) STUB_NOP
void MemPoolMeter::flush() STUB
static MemPools tmpMemPools;
MemPools &MemPools::GetInstance() {return tmpMemPools;}
-MemPools::MemPools() :
- pools(nullptr),
- mem_idle_limit(0),
- poolCount(0),
- defaultIsChunked(false)
-{}
+MemPools::MemPools() STUB_NOP
void MemPools::flushMeters() STUB
MemImplementingAllocator * MemPools::create(const char *, size_t) STUB_RETVAL(nullptr);
-void MemPools::setIdleLimit(ssize_t) STUB
-ssize_t MemPools::idleLimit() const STUB_RETVAL(0)
void MemPools::clean(time_t) STUB
void MemPools::setDefaultPoolChunking(bool const &) STUB