16#include "../../source/blender/blenlib/BLI_strict_flags.h"
26struct alignas(128) Local {
30 std::shared_ptr<Global> global;
33 bool destructed =
false;
45 std::atomic<int64_t> mem_in_use = 0;
49 std::atomic<int64_t> blocks_num = 0;
56 std::atomic<int64_t> mem_in_use_during_peak_update = 0;
70 std::mutex locals_mutex;
75 std::vector<Local *> locals;
88 std::atomic<int64_t> mem_in_use_outside_locals = 0;
92 std::atomic<int64_t> blocks_num_outside_locals = 0;
96 std::atomic<size_t> peak = 0;
115 static std::shared_ptr<Global> global = std::make_shared<Global>();
126 static thread_local Local local;
127 assert(!local.destructed);
135 std::lock_guard
lock{this->global->locals_mutex};
136 if (this->global->locals.empty()) {
139 this->is_main =
true;
142 this->global->locals.push_back(
this);
147 std::lock_guard
lock{this->global->locals_mutex};
150 this->global->locals.erase(
151 std::find(this->global->locals.begin(), this->global->locals.end(),
this));
153 this->global->blocks_num_outside_locals.fetch_add(this->blocks_num, std::memory_order_relaxed);
154 this->global->mem_in_use_outside_locals.fetch_add(this->
mem_in_use, std::memory_order_relaxed);
162 this->destructed =
true;
172 std::lock_guard
lock{global.locals_mutex};
174 for (Local *local : global.locals) {
175 assert(!local->destructed);
178 local->mem_in_use_during_peak_update = local->mem_in_use.load(std::memory_order_relaxed);
196 local.blocks_num.fetch_add(1, std::memory_order_relaxed);
197 local.mem_in_use.fetch_add(
int64_t(size), std::memory_order_relaxed);
207 global.blocks_num_outside_locals.fetch_add(1, std::memory_order_relaxed);
208 global.mem_in_use_outside_locals.fetch_add(
int64_t(size), std::memory_order_relaxed);
218 local.mem_in_use.fetch_sub(
int64_t(size), std::memory_order_relaxed);
219 local.blocks_num.fetch_sub(1, std::memory_order_relaxed);
224 global.blocks_num_outside_locals.fetch_sub(1, std::memory_order_relaxed);
225 global.mem_in_use_outside_locals.fetch_sub(
int64_t(size), std::memory_order_relaxed);
232 std::lock_guard
lock{global.locals_mutex};
235 int64_t blocks_num = global.blocks_num_outside_locals;
236 for (
const Local *local : global.locals) {
237 blocks_num += local->blocks_num;
239 return size_t(blocks_num);
245 std::lock_guard
lock{global.locals_mutex};
249 for (
const Local *local : global.locals) {
Read Guarded memory(de)allocation.
size_t memory_usage_current(void)
void memory_usage_block_alloc(size_t size)
size_t memory_usage_block_num(void)
void memory_usage_init(void)
void memory_usage_block_free(size_t size)
size_t memory_usage_peak(void)
void memory_usage_peak_reset(void)
static void update_global_peak()
static constexpr int64_t peak_update_threshold
static std::shared_ptr< Global > & get_global_ptr()
static std::atomic< bool > use_local_counters
static Global & get_global()
static Local & get_local_data()