@@ -92,10 +92,16 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
9292 throw ;
9393 }
9494
95- #ifdef BOUNDED_MR_STATS
96- size_t peak = mStats .peak .load (std::memory_order_relaxed);
95+ size_t peak = mPeakUsedMemory .load (std::memory_order_relaxed);
9796 while (new_used > peak &&
98- !mStats .peak .compare_exchange_weak (peak, new_used,
97+ !mPeakUsedMemory .compare_exchange_weak (peak, new_used,
98+ std::memory_order_relaxed)) {
99+ }
100+
101+ #ifdef BOUNDED_MR_STATS
102+ size_t statsPeak = mStats .peak .load (std::memory_order_relaxed);
103+ while (new_used > statsPeak &&
104+ !mStats .peak .compare_exchange_weak (statsPeak, new_used,
99105 std::memory_order_relaxed)) {
100106 }
101107 mStats .live .fetch_add (1 , std::memory_order_relaxed);
@@ -137,6 +143,23 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
137143 {
138144 return mCountThrow .load (std::memory_order_relaxed);
139145 }
146+ [[nodiscard]] size_t getPeakMemory () const noexcept
147+ {
148+ return mPeakUsedMemory .load (std::memory_order_relaxed);
149+ }
150+ [[nodiscard]] size_t getPeakMemoryDelta () const noexcept
151+ {
152+ const size_t peak = mPeakUsedMemory .load (std::memory_order_relaxed);
153+ const size_t baseline = mPeakBaselineMemory .load (std::memory_order_relaxed);
154+ return peak > baseline ? peak - baseline : 0 ;
155+ }
156+
157+ void resetPeakMemory () noexcept
158+ {
159+ const size_t used = mUsedMemory .load (std::memory_order_acquire);
160+ mPeakBaselineMemory .store (used, std::memory_order_release);
161+ mPeakUsedMemory .store (used, std::memory_order_release);
162+ }
140163
141164 void setMaxMemory (size_t max)
142165 {
@@ -166,12 +189,14 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
166189 {
167190 const auto throw_ = mCountThrow .load (std::memory_order_relaxed);
168191 const auto used = static_cast <double >(mUsedMemory .load (std::memory_order_relaxed));
192+ const auto peak = static_cast <double >(mPeakUsedMemory .load (std::memory_order_relaxed));
193+ const auto peakDelta = static_cast <double >(getPeakMemoryDelta ());
169194 const auto maxm = mMaxMemory .load (std::memory_order_relaxed);
170195 std::string ret;
171196 if (maxm == std::numeric_limits<size_t >::max ()) {
172- ret += std::format (" maxthrow={} maxmem=unbounded used={:.2f} GB" , throw_, used / constants::GB);
197+ ret += std::format (" maxthrow={} maxmem=unbounded used={:.2f} GB stagepeak={:.2f} GB stagealloc={:.2f} GB " , throw_, used / constants::GB, peak / constants::GB, peakDelta / constants::GB);
173198 } else {
174- ret += std::format (" maxthrow={} maxmem={:.2f} GB used={:.2f} GB ({:.2f}%)" , throw_, (double )maxm / constants::GB, used / constants::GB, 100.0 * used / (double )maxm);
199+ ret += std::format (" maxthrow={} maxmem={:.2f} GB used={:.2f} GB ({:.2f}%) stagepeak={:.2f} GB stagealloc={:.2f} GB " , throw_, (double )maxm / constants::GB, used / constants::GB, 100.0 * used / (double )maxm, peak / constants::GB, peakDelta / constants::GB );
175200 }
176201#ifdef BOUNDED_MR_STATS
177202 ret += std::format (" peak={:.2f} GB live={} nAlloc={} nFree={} totalAlloc={:.2f} GB totalFreed={:.2f} GB maxAlign={} upstreamFail={}" ,
@@ -197,6 +222,8 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
197222 std::atomic<size_t > mMaxMemory {std::numeric_limits<size_t >::max ()};
198223 std::atomic<size_t > mCountThrow {0 };
199224 std::atomic<size_t > mUsedMemory {0 };
225+ std::atomic<size_t > mPeakUsedMemory {0 };
226+ std::atomic<size_t > mPeakBaselineMemory {0 };
200227 std::unique_ptr<ExternalAllocatorAdaptor> mAdaptor {nullptr };
201228 std::pmr::memory_resource* mUpstream {nullptr };
202229
0 commit comments