Blender V5.0
MEM_CacheLimiterC-Api.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2006-2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cstddef>
10#include <list>
11
12#include "MEM_CacheLimiter.h"
14
15static bool is_disabled = false;
16
17static size_t &get_max()
18{
19 static size_t m = 32 * 1024 * 1024;
20 return m;
21}
22
24{
25 get_max() = m;
26}
27
29{
30 return get_max();
31}
32
34{
35 is_disabled = disabled;
36}
37
39{
40 return is_disabled;
41}
42
45
48using list_t =
49 std::list<MEM_CacheLimiterHandleCClass *, MEM_Allocator<MEM_CacheLimiterHandleCClass *>>;
50
52 public:
55 : data_destructor(data_destructor_), cache(data_size)
56 {
57 }
59
60 handle_t *insert(void *data);
61
62 void destruct(void *data, list_t::iterator it);
63
65 {
66 return &cache;
67 }
68
69 private:
70 MEM_CacheLimiter_Destruct_Func data_destructor;
71
73
74 list_t cclass_list;
75};
76
78 public:
80 : data(data_), parent(parent_)
81 {
82 }
83
85
86 void set_iter(list_t::iterator it_)
87 {
88 it = it_;
89 }
90
91 void set_data(void *data_)
92 {
93 data = data_;
94 }
95
96 void *get_data() const
97 {
98 return data;
99 }
100
101 private:
102 void *data;
104 list_t::iterator it;
105};
106
108{
109 cclass_list.push_back(new MEM_CacheLimiterHandleCClass(data, this));
110 list_t::iterator it = cclass_list.end();
111 --it;
112 cclass_list.back()->set_iter(it);
113
114 return cache.insert(cclass_list.back());
115}
116
117void MEM_CacheLimiterCClass::destruct(void *data, list_t::iterator it)
118{
119 data_destructor(data);
120 cclass_list.erase(it);
121}
122
124{
125 if (data) {
126 parent->destruct(data, it);
127 }
128}
129
131{
132 // should not happen, but don't leak memory in this case...
133 for (list_t::iterator it = cclass_list.begin(); it != cclass_list.end(); it++) {
134 (*it)->set_data(nullptr);
135
136 delete *it;
137 }
138}
139
140// ----------------------------------------------------------------------
141
143{
144 return (MEM_CacheLimiterCClass *)l;
145}
146
148{
149 return (handle_t *)l;
150}
151
154{
155 return (MEM_CacheLimiterC *)new MEM_CacheLimiterCClass(data_destructor, data_size);
156}
157
159{
160 delete cast(This);
161}
162
167
169{
170 cast(This)->get_cache()->enforce_limits();
171}
172
174{
175 cast(handle)->unmanage();
176}
177
179{
180 cast(handle)->touch();
181}
182
184{
185 cast(handle)->ref();
186}
187
189{
190 cast(handle)->unref();
191}
192
194{
195 return cast(handle)->get_refcount();
196}
197
199{
200 return cast(handle)->get()->get_data();
201}
202
204 MEM_CacheLimiter_ItemPriority_Func item_priority_func)
205{
206 cast(This)->get_cache()->set_item_priority_func(item_priority_func);
207}
208
210 MEM_CacheLimiterC *This, MEM_CacheLimiter_ItemDestroyable_Func item_destroyable_func)
211{
212 cast(This)->get_cache()->set_item_destroyable_func(item_destroyable_func);
213}
214
216{
217 return cast(This)->get_cache()->get_memory_in_use();
218}
void MEM_CacheLimiter_ItemPriority_Func_set(MEM_CacheLimiterC *This, MEM_CacheLimiter_ItemPriority_Func item_priority_func)
void MEM_CacheLimiter_set_maximum(size_t m)
void MEM_CacheLimiter_enforce_limits(MEM_CacheLimiterC *This)
static bool is_disabled
void MEM_CacheLimiter_touch(MEM_CacheLimiterHandleC *handle)
void MEM_CacheLimiter_unref(MEM_CacheLimiterHandleC *handle)
MEM_CacheLimiter< MEM_CacheLimiterHandleCClass > cache_t
void delete_MEM_CacheLimiter(MEM_CacheLimiterC *This)
int MEM_CacheLimiter_get_refcount(MEM_CacheLimiterHandleC *handle)
void MEM_CacheLimiter_ItemDestroyable_Func_set(MEM_CacheLimiterC *This, MEM_CacheLimiter_ItemDestroyable_Func item_destroyable_func)
std::list< MEM_CacheLimiterHandleCClass *, MEM_Allocator< MEM_CacheLimiterHandleCClass * > > list_t
size_t MEM_CacheLimiter_get_memory_in_use(MEM_CacheLimiterC *This)
void MEM_CacheLimiter_set_disabled(bool disabled)
size_t MEM_CacheLimiter_get_maximum()
static size_t & get_max()
MEM_CacheLimiterHandle< MEM_CacheLimiterHandleCClass > handle_t
bool MEM_CacheLimiter_is_disabled(void)
MEM_CacheLimiterC * new_MEM_CacheLimiter(MEM_CacheLimiter_Destruct_Func data_destructor, MEM_CacheLimiter_DataSize_Func data_size)
MEM_CacheLimiterHandleC * MEM_CacheLimiter_insert(MEM_CacheLimiterC *This, void *data)
void MEM_CacheLimiter_ref(MEM_CacheLimiterHandleC *handle)
void MEM_CacheLimiter_unmanage(MEM_CacheLimiterHandleC *handle)
void * MEM_CacheLimiter_get(MEM_CacheLimiterHandleC *handle)
struct MEM_CacheLimiter_s MEM_CacheLimiterC
int(*)(void *, int) MEM_CacheLimiter_ItemPriority_Func
size_t(*)(void *) MEM_CacheLimiter_DataSize_Func
void(*)(void *) MEM_CacheLimiter_Destruct_Func
struct MEM_CacheLimiterHandle_s MEM_CacheLimiterHandleC
bool(*)(void *) MEM_CacheLimiter_ItemDestroyable_Func
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMLoop * l
void destruct(void *data, list_t::iterator it)
MEM_CacheLimiterCClass(MEM_CacheLimiter_Destruct_Func data_destructor_, MEM_CacheLimiter_DataSize_Func data_size)
handle_t * insert(void *data)
void set_iter(list_t::iterator it_)
MEM_CacheLimiterHandleCClass(void *data_, MEM_CacheLimiterCClass *parent_)
#define cast