Bug #2789: Optimize unlimited memory pools, and correctly handle limits > 2GB.
/// \ingroup MemPoolsAPI
#define MB ((size_t)1024*1024)
/// \ingroup MemPoolsAPI
-#define mem_unlimited_size 2 * 1024 * MB
-/// \ingroup MemPoolsAPI
#define toMB(size) ( ((double) size) / MB )
/// \ingroup MemPoolsAPI
#define toKB(size) ( (size + 1024 - 1) / 1024 )
* totally free chunks are immediately considered for release. Otherwise
* only chunks that have not been referenced for a long time are checked.
*/
- void setIdleLimit(size_t new_idle_limit);
-
- size_t idleLimit() const;
+ void setIdleLimit(ssize_t new_idle_limit);
+ ssize_t idleLimit() const;
/**
\par
void setDefaultPoolChunking(bool const &);
MemImplementingAllocator *pools;
- int mem_idle_limit;
+ ssize_t mem_idle_limit;
int poolCount;
bool defaultIsChunked;
private:
int tot_items_idle;
int tot_overhead;
- int mem_idle_limit;
+ ssize_t mem_idle_limit;
};
/// \ingroup MemPoolsAPI
}
void
-MemPools::setIdleLimit(size_t new_idle_limit)
+MemPools::setIdleLimit(ssize_t new_idle_limit)
{
mem_idle_limit = new_idle_limit;
}
-size_t
+ssize_t
MemPools::idleLimit() const
{
return mem_idle_limit;
void
MemPools::clean(time_t maxage)
{
- MemImplementingAllocator *pool;
- MemPoolIterator *iter;
+ flushMeters();
+ if (mem_idle_limit < 0) // no limit to enforce
+ return;
int shift = 1;
- flushMeters();
if (TheMeter.idle.level > mem_idle_limit)
maxage = shift = 0;
+ MemImplementingAllocator *pool;
+ MemPoolIterator *iter;
iter = memPoolIterate();
while ((pool = memPoolIterateNext(iter)))
if (pool->idleTrigger(shift))
memory_pools_limit to a reasonably high value even if your
configuration will use less memory.
- If set to zero, Squid will keep all memory it can. That is, there
+ If set to none, Squid will keep all memory it can. That is, there
will be no limit on the total amount of memory used for safe-keeping.
To disable memory allocation optimization, do not set
new_pool_limit = 0;
else if (Config.MemPools.limit > 0)
new_pool_limit = Config.MemPools.limit;
- else
- new_pool_limit = mem_unlimited_size;
+ else {
+ if (Config.MemPools.limit == 0)
+ debugs(13, 1, "memory_pools_limit 0 has been chagned to memory_pools_limit none. Please update your config");
+ new_pool_limit = -1;
+ }
#if 0
/** \par
stream << "Current overhead: " << mp_total.tot_overhead << " bytes (" <<
std::setprecision(3) << xpercent(mp_total.tot_overhead, mp_total.TheMeter->inuse.level) << "%)\n";
/* limits */
- stream << "Idle pool limit: " << std::setprecision(2) << toMB(mp_total.mem_idle_limit) << " MB\n";
+ if (mp_total.mem_idle_limit >= 0)
+ stream << "Idle pool limit: " << std::setprecision(2) << toMB(mp_total.mem_idle_limit) << " MB\n";
/* limits */
stream << "Total Pools created: " << mp_total.tot_pools_alloc << "\n";
stream << "Pools ever used: " << mp_total.tot_pools_alloc - not_used << " (shown above)\n";