16#ifndef TRACKINGITSU_INCLUDE_BOUNDEDALLOCATOR_H_
17#define TRACKINGITSU_INCLUDE_BOUNDEDALLOCATOR_H_
20#include <memory_resource>
39 : mAttempted(attempted), mUsed(used), mMax(
max) {}
40 const char*
what() const noexcept final
42 static thread_local char msg[256];
43 if (mAttempted != 0) {
45 "Reached set memory limit (attempted: %zu, used: %zu, max: %zu)",
46 mAttempted, mUsed, mMax);
49 "New set maximum below current used (newMax: %zu, used: %zu)",
56 size_t mAttempted{0}, mUsed{0}, mMax{0};
60 : mMaxMemory(maxBytes), mUpstream(upstream) {}
65 size_t new_used{0}, current_used{mUsedMemory.load(std::memory_order_relaxed)};
67 new_used = current_used + bytes;
68 if (new_used > mMaxMemory) {
72 }
while (!mUsedMemory.compare_exchange_weak(current_used, new_used,
73 std::memory_order_acq_rel,
74 std::memory_order_relaxed));
77 p = mUpstream->allocate(bytes, alignment);
79 mUsedMemory.fetch_sub(bytes, std::memory_order_relaxed);
87 mUpstream->deallocate(p, bytes, alignment);
88 mUsedMemory.fetch_sub(bytes, std::memory_order_relaxed);
93 return this == &
other;
100 size_t used = mUsedMemory.load(std::memory_order_acquire);
105 mMaxMemory.store(
max, std::memory_order_release);
110#if !defined(GPUCA_GPUCODE_DEVICE)
111 constexpr double GB{1024 * 1024 * 1024};
112 auto throw_ = mCountThrow.load(std::memory_order_relaxed);
113 auto used =
static_cast<double>(mUsedMemory.load(std::memory_order_relaxed));
114 LOGP(info,
"maxthrow={} maxmem={:.2f} GB used={:.2f} ({:.2f}%)",
115 throw_, (
double)mMaxMemory /
GB, used /
GB, 100. * used / (
double)mMaxMemory);
120 std::atomic<size_t> mMaxMemory{std::numeric_limits<size_t>::max()};
121 std::atomic<size_t> mCountThrow{0};
122 std::atomic<size_t> mUsedMemory{0};
123 std::unique_ptr<ExternalAllocatorAdaptor> mAdaptor{
nullptr};
133 std::vector<T>().swap(
vec);
140 vec.~bounded_vector<T>();
147 for (
auto&
v :
vec) {
152template <
typename T,
size_t S>
155 for (
size_t i{0};
i <
S; ++
i) {
164 vec.~bounded_vector<T>();
173 for (
size_t i = 0;
i <
size; ++
i) {
178template <
typename T,
size_t S>
181 for (
size_t i{0};
i <
S; ++
i) {
189 std::vector<T> t(
b.size());
190 std::copy(
b.cbegin(),
b.cend(), t.begin());
const char * what() const noexcept final
MemoryLimitExceeded(size_t attempted, size_t used, size_t max)
void * do_allocate(size_t bytes, size_t alignment) final
BoundedMemoryResource(ExternalAllocator *alloc)
void do_deallocate(void *p, size_t bytes, size_t alignment) final
size_t getMaxMemory() const noexcept
bool do_is_equal(const std::pmr::memory_resource &other) const noexcept final
void setMaxMemory(size_t max)
BoundedMemoryResource(size_t maxBytes=std::numeric_limits< size_t >::max(), std::pmr::memory_resource *upstream=std::pmr::get_default_resource())
size_t getUsedMemory() const noexcept
GLboolean GLboolean GLboolean b
void deepVectorClear(std::vector< T > &vec)
std::pmr::vector< T > bounded_vector
std::vector< T > toSTDVector(const bounded_vector< T > &b)
void clearResizeBoundedArray(std::array< bounded_vector< T >, S > &arr, size_t size, std::pmr::memory_resource *mr=nullptr, T def=T())
void clearResizeBoundedVector(bounded_vector< T > &vec, size_t sz, std::pmr::memory_resource *mr=nullptr, T def=T())
Defining DataPointCompositeObject explicitly as copiable.
VectorOfTObjectPtrs other
std::vector< o2::ctf::BufferType > vec
uint64_t const void const *restrict const msg