/*
- * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
*/
/*
- * DEBUG: section 63 Low Level Memory Pool Management
* AUTHOR: Alex Rousskov, Andres Kroonmaa, Robert Collins, Henrik Nordstrom
*/
#include "squid.h"
#include "mem/PoolMalloc.h"
+#include "mem/Stats.h"
#include <cassert>
#include <cstring>
void *
MemPoolMalloc::allocate()
{
- void *obj = NULL;
+ void *obj = nullptr;
if (!freelist.empty()) {
obj = freelist.top();
freelist.pop();
}
if (obj) {
- memMeterDec(meter.idle);
+ --meter.idle;
++saved_calls;
} else {
if (doZero)
obj = xcalloc(1, obj_size);
else
obj = xmalloc(obj_size);
- memMeterInc(meter.alloc);
+ ++meter.alloc;
}
- memMeterInc(meter.inuse);
+ ++meter.inuse;
return obj;
}
void
MemPoolMalloc::deallocate(void *obj, bool aggressive)
{
- memMeterDec(meter.inuse);
+ --meter.inuse;
if (aggressive) {
xfree(obj);
- memMeterDec(meter.alloc);
+ --meter.alloc;
} else {
if (doZero)
memset(obj, 0, obj_size);
- memMeterInc(meter.idle);
+ ++meter.idle;
freelist.push(obj);
}
}
/* TODO extract common logic to MemAllocate */
-int
-MemPoolMalloc::getStats(MemPoolStats * stats, int accumulate)
+size_t
+MemPoolMalloc::getStats(Mem::PoolStats &stats)
{
- if (!accumulate) /* need skip memset for GlobalStats accumulation */
- memset(stats, 0, sizeof(MemPoolStats));
-
- stats->pool = this;
- stats->label = objectType();
- stats->meter = &meter;
- stats->obj_size = obj_size;
- stats->chunk_capacity = 0;
+ stats.pool = this;
+ stats.label = objectType();
+ stats.meter = &meter;
+ stats.obj_size = obj_size;
+ stats.chunk_capacity = 0;
- stats->chunks_alloc += 0;
- stats->chunks_inuse += 0;
- stats->chunks_partial += 0;
- stats->chunks_free += 0;
+ stats.chunks_alloc += 0;
+ stats.chunks_inuse += 0;
+ stats.chunks_partial += 0;
+ stats.chunks_free += 0;
- stats->items_alloc += meter.alloc.level;
- stats->items_inuse += meter.inuse.level;
- stats->items_idle += meter.idle.level;
+ stats.items_alloc += meter.alloc.currentLevel();
+ stats.items_inuse += meter.inuse.currentLevel();
+ stats.items_idle += meter.idle.currentLevel();
- stats->overhead += sizeof(MemPoolMalloc) + strlen(objectType()) + 1;
+ stats.overhead += sizeof(MemPoolMalloc) + strlen(objectType()) + 1;
- return meter.inuse.level;
+ return meter.inuse.currentLevel();
}
int
MemPoolMalloc::getInUseCount()
{
- return meter.inuse.level;
+ return meter.inuse.currentLevel();
}
MemPoolMalloc::MemPoolMalloc(char const *aLabel, size_t aSize) : MemImplementingAllocator(aLabel, aSize)
MemPoolMalloc::~MemPoolMalloc()
{
- assert(meter.inuse.level == 0);
+ assert(meter.inuse.currentLevel() == 0);
clean(0);
}
while (!freelist.empty()) {
void *obj = freelist.top();
freelist.pop();
- memMeterDec(meter.idle);
- memMeterDec(meter.alloc);
+ --meter.idle;
+ --meter.alloc;
xfree(obj);
}
}