From: Amos Jeffries Date: Thu, 24 Nov 2022 00:17:11 +0000 (+0000) Subject: Move MemPoolMeter into Mem namespace (#1183) X-Git-Tag: SQUID_6_0_1~75 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=09c020f2304fd9d95f1e4553cb8b84aeda31fb35;p=thirdparty%2Fsquid.git Move MemPoolMeter into Mem namespace (#1183) Simplified PoolMeter::flush() implementation and inlined it for performance. Convert mgb_t type to a sub-struct and inline C++11 initialization for performance. Also update Mem::Meter initialization. --- diff --git a/src/mem/AllocatorProxy.cc b/src/mem/AllocatorProxy.cc index 0ef60cf8ca..a7ebe0e2e1 100644 --- a/src/mem/AllocatorProxy.cc +++ b/src/mem/AllocatorProxy.cc @@ -8,6 +8,7 @@ #include "squid.h" #include "mem/AllocatorProxy.h" +#include "mem/Meter.h" #include "mem/Pool.h" void * @@ -50,7 +51,7 @@ Mem::AllocatorProxy::zeroBlocks(bool doIt) getAllocator()->zeroBlocks(doIt); } -MemPoolMeter const & +Mem::PoolMeter const & Mem::AllocatorProxy::getMeter() const { return getAllocator()->getMeter(); diff --git a/src/mem/AllocatorProxy.h b/src/mem/AllocatorProxy.h index 971555e03a..00209aa31f 100644 --- a/src/mem/AllocatorProxy.h +++ b/src/mem/AllocatorProxy.h @@ -11,7 +11,6 @@ class MemAllocator; class MemPoolStats; -class MemPoolMeter; /** * \hideinitializer @@ -45,6 +44,8 @@ class MemPoolMeter; namespace Mem { +class PoolMeter; + /** * Support late binding of pool type for allocator agnostic classes */ @@ -68,7 +69,7 @@ public: size_t objectSize() const {return size;} char const * objectType() const {return label;} - MemPoolMeter const &getMeter() const; + PoolMeter const &getMeter() const; /** * \param stats Object to be filled with statistical data about pool. diff --git a/src/mem/Meter.h b/src/mem/Meter.h index 61c91145ec..653d0657a4 100644 --- a/src/mem/Meter.h +++ b/src/mem/Meter.h @@ -20,8 +20,6 @@ namespace Mem class Meter { public: - Meter() : level(0), hwater_level(0), hwater_stamp(0) {} - /// flush the meter level back to 0, but leave peak records void flush() {level=0;} @@ -45,9 +43,47 @@ private: } } - ssize_t level; ///< current level (count or volume) - ssize_t hwater_level; ///< high water mark - time_t hwater_stamp; ///< timestamp of last high water mark change + ssize_t level = 0; ///< current level (count or volume) + ssize_t hwater_level = 0; ///< high water mark + time_t hwater_stamp = 0; ///< timestamp of last high water mark change +}; + +/** + * Object to track per-pool memory usage (alloc = inuse+idle) + */ +class PoolMeter +{ +public: + /// Object to track per-pool cumulative counters + struct mgb_t { + double count = 0.0; + double bytes = 0.0; + }; + + /// flush counters back to 0, but leave historic peak records + void flush() { + alloc.flush(); + inuse.flush(); + idle.flush(); + gb_allocated = mgb_t(); + gb_oallocated = mgb_t(); + gb_saved = mgb_t(); + gb_freed = mgb_t(); + } + + Meter alloc; + Meter inuse; + Meter idle; + + /** history Allocations */ + mgb_t gb_allocated; + mgb_t gb_oallocated; + + /** account Saved Allocations */ + mgb_t gb_saved; + + /** account Free calls */ + mgb_t gb_freed; }; } // namespace Mem diff --git a/src/mem/Pool.cc b/src/mem/Pool.cc index 259d09514e..1f5c32f621 100644 --- a/src/mem/Pool.cc +++ b/src/mem/Pool.cc @@ -21,7 +21,7 @@ extern time_t squid_curtime; -static MemPoolMeter TheMeter; +static Mem::PoolMeter TheMeter; static MemPoolIterator Iterator; static int Pool_id_counter = 0; @@ -133,27 +133,6 @@ MemImplementingAllocator::flushMetersFull() getMeter().gb_freed.bytes = getMeter().gb_freed.count * obj_size; } -void -MemPoolMeter::flush() -{ - alloc.flush(); - inuse.flush(); - idle.flush(); - gb_allocated.count = 0; - gb_allocated.bytes = 0; - gb_oallocated.count = 0; - gb_oallocated.bytes = 0; - gb_saved.count = 0; - gb_saved.bytes = 0; - gb_freed.count = 0; - gb_freed.bytes = 0; -} - -MemPoolMeter::MemPoolMeter() -{ - flush(); -} - /* * Updates all pool counters, and recreates TheMeter totals from all pools */ @@ -332,13 +311,13 @@ MemImplementingAllocator::~MemImplementingAllocator() --MemPools::GetInstance().poolCount; } -MemPoolMeter const & +Mem::PoolMeter const & MemImplementingAllocator::getMeter() const { return meter; } -MemPoolMeter & +Mem::PoolMeter & MemImplementingAllocator::getMeter() { return meter; diff --git a/src/mem/Pool.h b/src/mem/Pool.h index 84cf99ed6a..d4d217960c 100644 --- a/src/mem/Pool.h +++ b/src/mem/Pool.h @@ -73,43 +73,6 @@ public: MemPoolIterator * next; }; -/** - \ingroup MemPoolsAPI - * Object to track per-pool cumulative counters - */ -class mgb_t -{ -public: - mgb_t() : count(0), bytes(0) {} - double count; - double bytes; -}; - -/** - \ingroup MemPoolsAPI - * Object to track per-pool memory usage (alloc = inuse+idle) - */ -class MemPoolMeter -{ -public: - MemPoolMeter(); - void flush(); - - Mem::Meter alloc; - Mem::Meter inuse; - Mem::Meter idle; - - /** history Allocations */ - mgb_t gb_allocated; - mgb_t gb_oallocated; - - /** account Saved Allocations */ - mgb_t gb_saved; - - /** account Free calls */ - mgb_t gb_freed; -}; - class MemImplementingAllocator; /// \ingroup MemPoolsAPI @@ -183,6 +146,8 @@ private: class MemAllocator { public: + typedef Mem::PoolMeter PoolMeter; // TODO remove + MemAllocator (char const *aLabel); virtual ~MemAllocator() {} @@ -192,7 +157,7 @@ public: */ virtual int getStats(MemPoolStats * stats, int accumulate = 0) = 0; - virtual MemPoolMeter const &getMeter() const = 0; + virtual PoolMeter const &getMeter() const = 0; /** * Allocate one element from the pool @@ -245,10 +210,12 @@ private: class MemImplementingAllocator : public MemAllocator { public: + typedef Mem::PoolMeter PoolMeter; // TODO remove + MemImplementingAllocator(char const *aLabel, size_t aSize); virtual ~MemImplementingAllocator(); - virtual MemPoolMeter const &getMeter() const; - virtual MemPoolMeter &getMeter(); + virtual PoolMeter const &getMeter() const; + virtual PoolMeter &getMeter(); virtual void flushMetersFull(); virtual void flushMeters(); @@ -269,7 +236,7 @@ public: protected: virtual void *allocate() = 0; virtual void deallocate(void *, bool aggressive) = 0; - MemPoolMeter meter; + PoolMeter meter; int memPID; public: MemImplementingAllocator *next; @@ -284,9 +251,11 @@ public: class MemPoolStats { public: + typedef Mem::PoolMeter PoolMeter; // TODO remove + MemAllocator *pool; const char *label; - MemPoolMeter *meter; + PoolMeter *meter; int obj_size; int chunk_capacity; int chunk_size; @@ -306,7 +275,9 @@ public: /// \ingroup MemPoolsAPI /// TODO: Classify and add constructor/destructor to initialize properly. struct _MemPoolGlobalStats { - MemPoolMeter *TheMeter; + typedef Mem::PoolMeter PoolMeter; // TODO remove + + PoolMeter *TheMeter; int tot_pools_alloc; int tot_pools_inuse; diff --git a/src/mem/forward.h b/src/mem/forward.h index 82600c6e57..b5869f621e 100644 --- a/src/mem/forward.h +++ b/src/mem/forward.h @@ -17,16 +17,18 @@ class StoreEntry; class MemPoolStats; -class MemPoolMeter; /// Memory Management namespace Mem { +class Meter; +class PoolMeter; + void Init(); void Stats(StoreEntry *); void CleanIdlePools(void *unused); void Report(std::ostream &); -void PoolReport(const MemPoolStats * mp_st, const MemPoolMeter * AllMeter, std::ostream &); +void PoolReport(const MemPoolStats *, const PoolMeter *, std::ostream &); }; extern const size_t squidSystemPageSize; diff --git a/src/mem/old_api.cc b/src/mem/old_api.cc index 5607ed00aa..f003e0750e 100644 --- a/src/mem/old_api.cc +++ b/src/mem/old_api.cc @@ -576,14 +576,12 @@ memFreeBufFunc(size_t size) } } -/* MemPoolMeter */ - void -Mem::PoolReport(const MemPoolStats * mp_st, const MemPoolMeter * AllMeter, std::ostream &stream) +Mem::PoolReport(const MemPoolStats * mp_st, const PoolMeter * AllMeter, std::ostream &stream) { int excess = 0; int needed = 0; - MemPoolMeter *pm = mp_st->meter; + PoolMeter *pm = mp_st->meter; const char *delim = "\t "; stream.setf(std::ios_base::fixed); diff --git a/src/tests/stub_libmem.cc b/src/tests/stub_libmem.cc index 843db0b95d..8ea7216d3f 100644 --- a/src/tests/stub_libmem.cc +++ b/src/tests/stub_libmem.cc @@ -17,8 +17,7 @@ void *Mem::AllocatorProxy::alloc() {return xmalloc(64*1024);} void Mem::AllocatorProxy::freeOne(void *address) {xfree(address);} int Mem::AllocatorProxy::inUseCount() const {return 0;} -//static MemPoolMeter tmpMemPoolMeter; -//MemPoolMeter const &Mem::AllocatorProxy::getMeter() const STUB_RETVAL(tmpMemPoolMeter) +//Mem::PoolMeter const &Mem::AllocatorProxy::getMeter() const STUB_RETSTATREF(PoolMeter) int Mem::AllocatorProxy::getStats(MemPoolStats *) STUB_RETVAL(0) #include "mem/forward.h" @@ -26,7 +25,7 @@ void Mem::Init() STUB_NOP void Mem::Stats(StoreEntry *) STUB_NOP void Mem::CleanIdlePools(void *) STUB_NOP void Mem::Report(std::ostream &) STUB_NOP -void Mem::PoolReport(const MemPoolStats *, const MemPoolMeter *, std::ostream &) STUB_NOP +void Mem::PoolReport(const MemPoolStats *, const PoolMeter *, std::ostream &) STUB_NOP //const size_t squidSystemPageSize = 4096; void memClean(void) STUB void memInitModule(void) STUB @@ -77,8 +76,6 @@ void memDataInit(mem_type, const char *, size_t, int, bool) STUB_NOP void memCheckInit(void) STUB_NOP #include "mem/Pool.h" -MemPoolMeter::MemPoolMeter() STUB_NOP -void MemPoolMeter::flush() STUB static MemPools tmpMemPools; MemPools &MemPools::GetInstance() {return tmpMemPools;} MemPools::MemPools() STUB_NOP @@ -94,8 +91,8 @@ size_t MemAllocator::RoundedSize(size_t minSize) STUB_RETVAL(minSize) //MemImplementingAllocator::MemImplementingAllocator(char const *, size_t) STUB_NOP //MemImplementingAllocator::~MemImplementingAllocator(); -MemPoolMeter const &MemImplementingAllocator::getMeter() const STUB_RETSTATREF(MemPoolMeter) -MemPoolMeter &MemImplementingAllocator::getMeter() STUB_RETSTATREF(MemPoolMeter) +Mem::PoolMeter const &MemImplementingAllocator::getMeter() const STUB_RETSTATREF(PoolMeter) +Mem::PoolMeter &MemImplementingAllocator::getMeter() STUB_RETSTATREF(PoolMeter) void MemImplementingAllocator::flushMetersFull() STUB void MemImplementingAllocator::flushMeters() STUB void *MemImplementingAllocator::alloc() STUB_RETVAL(nullptr)