Blender V4.3
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
9#include <cstddef>
10
11#include "MEM_CacheLimiter.h"
13
14static bool is_disabled = false;
15
16static size_t &get_max()
17{
18 static size_t m = 32 * 1024 * 1024;
19 return m;
20}
21
23{
24 get_max() = m;
25}
26
28{
29 return get_max();
30}
31
33{
34 is_disabled = disabled;
35}
36
38{
39 return is_disabled;
40}
41
44
47typedef std::list<MEM_CacheLimiterHandleCClass *, MEM_Allocator<MEM_CacheLimiterHandleCClass *>>
49
51 public:
54 : data_destructor(data_destructor_), cache(data_size)
55 {
56 }
58
59 handle_t *insert(void *data);
60
61 void destruct(void *data, list_t::iterator it);
62
64 {
65 return &cache;
66 }
67
68 private:
69 MEM_CacheLimiter_Destruct_Func data_destructor;
70
72
73 list_t cclass_list;
74};
75
77 public:
79 : data(data_), parent(parent_)
80 {
81 }
82
84
85 void set_iter(list_t::iterator it_)
86 {
87 it = it_;
88 }
89
90 void set_data(void *data_)
91 {
92 data = data_;
93 }
94
95 void *get_data() const
96 {
97 return data;
98 }
99
100 private:
101 void *data;
103 list_t::iterator it;
104};
105
107{
108 cclass_list.push_back(new MEM_CacheLimiterHandleCClass(data, this));
109 list_t::iterator it = cclass_list.end();
110 --it;
111 cclass_list.back()->set_iter(it);
112
113 return cache.insert(cclass_list.back());
114}
115
116void MEM_CacheLimiterCClass::destruct(void *data, list_t::iterator it)
117{
118 data_destructor(data);
119 cclass_list.erase(it);
120}
121
123{
124 if (data) {
125 parent->destruct(data, it);
126 }
127}
128
130{
131 // should not happen, but don't leak memory in this case...
132 for (list_t::iterator it = cclass_list.begin(); it != cclass_list.end(); it++) {
133 (*it)->set_data(NULL);
134
135 delete *it;
136 }
137}
138
139// ----------------------------------------------------------------------
140
142{
143 return (MEM_CacheLimiterCClass *)l;
144}
145
147{
148 return (handle_t *)l;
149}
150
153{
154 return (MEM_CacheLimiterC *)new MEM_CacheLimiterCClass(data_destructor, data_size);
155}
156
158{
159 delete cast(This);
160}
161
166
171
173{
174 cast(handle)->unmanage();
175}
176
178{
179 cast(handle)->touch();
180}
181
183{
184 cast(handle)->ref();
185}
186
188{
189 cast(handle)->unref();
190}
191
193{
194 return cast(handle)->get_refcount();
195}
196
198{
199 return cast(handle)->get()->get_data();
200}
201
203 MEM_CacheLimiter_ItemPriority_Func item_priority_func)
204{
205 cast(This)->get_cache()->set_item_priority_func(item_priority_func);
206}
207
209 MEM_CacheLimiterC *This, MEM_CacheLimiter_ItemDestroyable_Func item_destroyable_func)
210{
211 cast(This)->get_cache()->set_item_destroyable_func(item_destroyable_func);
212}
213
void MEM_CacheLimiter_ItemPriority_Func_set(MEM_CacheLimiterC *This, MEM_CacheLimiter_ItemPriority_Func item_priority_func)
void MEM_CacheLimiter_set_maximum(size_t m)
static MEM_CacheLimiterCClass * cast(MEM_CacheLimiterC *l)
void MEM_CacheLimiter_enforce_limits(MEM_CacheLimiterC *This)
static bool is_disabled
MEM_CacheLimiter< MEM_CacheLimiterHandleCClass > cache_t
void MEM_CacheLimiter_touch(MEM_CacheLimiterHandleC *handle)
void MEM_CacheLimiter_unref(MEM_CacheLimiterHandleC *handle)
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)
MEM_CacheLimiterHandle< MEM_CacheLimiterHandleCClass > handle_t
size_t MEM_CacheLimiter_get_maximum()
static size_t & get_max()
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_CacheLimiterHandle_s MEM_CacheLimiterHandleC
int(* MEM_CacheLimiter_ItemPriority_Func)(void *, int)
bool(* MEM_CacheLimiter_ItemDestroyable_Func)(void *)
void(* MEM_CacheLimiter_Destruct_Func)(void *)
struct MEM_CacheLimiter_s MEM_CacheLimiterC
size_t(* MEM_CacheLimiter_DataSize_Func)(void *)
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_)
void set_item_destroyable_func(MEM_CacheLimiter_ItemDestroyable_Func item_destroyable_func)
void set_item_priority_func(MEM_CacheLimiter_ItemPriority_Func item_priority_func)
MEM_CacheLimiterHandle< T > * insert(T *elem)
#define NULL