]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Move MemPoolMeter into Mem namespace (#1183)
authorAmos Jeffries <yadij@users.noreply.github.com>
Thu, 24 Nov 2022 00:17:11 +0000 (00:17 +0000)
committerSquid Anubis <squid-anubis@squid-cache.org>
Thu, 24 Nov 2022 19:57:26 +0000 (19:57 +0000)
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.

src/mem/AllocatorProxy.cc
src/mem/AllocatorProxy.h
src/mem/Meter.h
src/mem/Pool.cc
src/mem/Pool.h
src/mem/forward.h
src/mem/old_api.cc
src/tests/stub_libmem.cc

index 0ef60cf8ca76455c0131eae79bb9d60c479b11ea..a7ebe0e2e1577f0750ad5569a32e855cc1189b81 100644 (file)
@@ -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();
index 971555e03a5b5cf13829a0438854702b3539b6ce..00209aa31f6a4ff436cc6e4154b38a0c44068f02 100644 (file)
@@ -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.
index 61c91145ec6b41ab62d84d2f5d70f609f3fdb317..653d0657a4cbf637ef11a3ecfdd01252af2b318f 100644 (file)
@@ -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
index 259d09514e9c450cd2648f5e003afb37f0886694..1f5c32f621ffc17a720a280f7b4d073644ad1b46 100644 (file)
@@ -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;
index 84cf99ed6aa8d431e5b6be47236f675866f8bb28..d4d217960cc4670d3f4ddaeb2e53e19c22a5c0ca 100644 (file)
@@ -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;
index 82600c6e578f7b921e656d16fa28d09970b3653f..b5869f621ed117d4ea79771309dd4f7dcc1bfe65 100644 (file)
 
 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;
index 5607ed00aa336c1f6d3b24e20563c55d4181b3b5..f003e0750e8d976c449b8ce60c3d884a6fd212db 100644 (file)
@@ -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);
index 843db0b95de9e221938ec9e48730b260b2bc2bd2..8ea7216d3fe0d70d3610f15d76bc9b56027980e8 100644 (file)
@@ -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)