Blender V5.0
mallocn.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2002-2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include "MEM_guardedalloc.h"
12
13/* To ensure strict conversions. */
14#include "../../source/blender/blenlib/BLI_strict_flags.h"
15
16#include <cassert>
17
18#include "mallocn_intern.hh"
19
21
22using namespace mem_guarded::internal;
23
24#ifdef WITH_MEM_JEMALLOC
30const char *malloc_conf =
31 "background_thread:true,dirty_decay_ms:4000,thp:always,metadata_thp:always";
32#endif
33
34/* NOTE: Keep in sync with MEM_use_lockfree_allocator(). */
35
36size_t (*MEM_allocN_len)(const void *vmemh) = MEM_lockfree_allocN_len;
38 AllocationType allocation_type) = MEM_lockfree_freeN;
39void *(*mem_guarded::internal::mem_dupallocN)(const void *vmemh) = MEM_lockfree_dupallocN;
40void *(*MEM_reallocN_id)(void *vmemh, size_t len, const char *str) = MEM_lockfree_reallocN_id;
41void *(*MEM_recallocN_id)(void *vmemh, size_t len, const char *str) = MEM_lockfree_recallocN_id;
42void *(*mem_guarded::internal::mem_callocN)(size_t len, const char *str) = MEM_lockfree_callocN;
43void *(*mem_guarded::internal::mem_calloc_arrayN)(size_t len,
44 size_t size,
45 const char *str) = MEM_lockfree_calloc_arrayN;
46void *(*mem_guarded::internal::mem_mallocN)(size_t len, const char *str) = MEM_lockfree_mallocN;
47void *(*mem_guarded::internal::mem_malloc_arrayN)(size_t len,
48 size_t size,
49 const char *str) = MEM_lockfree_malloc_arrayN;
50void *(*mem_guarded::internal::mem_mallocN_aligned_ex)(size_t len,
51 size_t alignment,
52 const char *str,
53 AllocationType allocation_type) =
55void *(*MEM_malloc_arrayN_aligned)(size_t len,
56 size_t size,
57 size_t alignment,
59void *(*MEM_calloc_arrayN_aligned)(size_t len,
60 size_t size,
61 size_t alignment,
65void (*MEM_callbackmemlist)(void (*func)(void *)) = MEM_lockfree_callbackmemlist;
67void (*MEM_set_error_callback)(void (*func)(const char *)) = MEM_lockfree_set_error_callback;
74
76
77#ifndef NDEBUG
78const char *(*MEM_name_ptr)(void *vmemh) = MEM_lockfree_name_ptr;
79void (*MEM_name_ptr_set)(void *vmemh, const char *str) = MEM_lockfree_name_ptr_set;
80#endif
81
82void *aligned_malloc(size_t size, size_t alignment)
83{
84 /* #posix_memalign requires alignment to be a multiple of `sizeof(void *)`. */
86
87#ifdef _WIN32
88 return _aligned_malloc(size, alignment);
89#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
90 void *result;
91
92 if (posix_memalign(&result, alignment, size)) {
93 /* non-zero means allocation error
94 * either no allocation or bad alignment value
95 */
96 return NULL;
97 }
98 return result;
99#else /* This is for Linux. */
100 return memalign(alignment, size);
101#endif
102}
103
104void aligned_free(void *ptr)
105{
106#ifdef _WIN32
107 _aligned_free(ptr);
108#else
109 free(ptr);
110#endif
111}
112
113void MEM_freeN(void *vmemh)
114{
116}
117
118void *MEM_callocN(size_t len, const char *str)
119{
120 return mem_callocN(len, str);
121}
122
123void *MEM_calloc_arrayN(size_t len, size_t size, const char *str)
124{
125 return mem_calloc_arrayN(len, size, str);
126}
127
128void *MEM_mallocN(size_t len, const char *str)
129{
130 return mem_mallocN(len, str);
131}
132
133void *MEM_malloc_arrayN(size_t len, size_t size, const char *str)
134{
135 return mem_malloc_arrayN(len, size, str);
136}
137
138void *MEM_mallocN_aligned(size_t len, size_t alignment, const char *str)
139{
141}
142
143void *MEM_dupallocN(const void *vmemh)
144{
145 return mem_dupallocN(vmemh);
146}
147
155{
156 /* NOTE: Assume that there is no "sticky" internal state which would make switching allocator
157 * type after all allocations are freed unsafe. In fact, it should be safe to change allocator
158 * type after all blocks has been freed: some regression tests do rely on this property of
159 * allocators. */
161}
162
164{
165 /* NOTE: Keep in sync with static initialization of the variables. */
166
167 /* TODO(sergey): Find a way to de-duplicate the logic. Maybe by requiring an explicit call
168 * to guarded allocator initialization at an application startup. */
169
171
195
197
198#ifndef NDEBUG
201#endif
202}
203
205{
207
231
233
234#ifndef NDEBUG
237#endif
238}
void BLI_kdtree_nd_ free(KDTree *tree)
unsigned int uint
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
#define str(s)
#define assert(assertion)
void * MEM_mallocN(size_t len, const char *str)
Definition mallocn.cc:128
size_t(* MEM_get_peak_memory)(void)
Definition mallocn.cc:73
void aligned_free(void *ptr)
Definition mallocn.cc:104
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:123
void MEM_use_lockfree_allocator()
Definition mallocn.cc:163
void * MEM_mallocN_aligned(size_t len, size_t alignment, const char *str)
Definition mallocn.cc:138
void *(* MEM_reallocN_id)(void *vmemh, size_t len, const char *str)
Definition mallocn.cc:40
void(* MEM_reset_peak_memory)(void)
Definition mallocn.cc:72
void(* MEM_name_ptr_set)(void *vmemh, const char *str)
Definition mallocn.cc:79
size_t(* MEM_get_memory_in_use)(void)
Definition mallocn.cc:70
const char *(* MEM_name_ptr)(void *vmemh)
Definition mallocn.cc:78
void *(* MEM_calloc_arrayN_aligned)(size_t len, size_t size, size_t alignment, const char *str)
Definition mallocn.cc:59
void(* MEM_printmemlist_stats)(void)
Definition mallocn.cc:66
void(* MEM_set_memory_debug)(void)
Definition mallocn.cc:69
void(* mem_clearmemlist)(void)
Definition mallocn.cc:75
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:133
void * MEM_dupallocN(const void *vmemh)
Definition mallocn.cc:143
void(* MEM_set_error_callback)(void(*func)(const char *))
Definition mallocn.cc:67
void MEM_use_guarded_allocator()
Definition mallocn.cc:204
size_t(* MEM_allocN_len)(const void *vmemh)
Definition mallocn.cc:36
void *(* MEM_recallocN_id)(void *vmemh, size_t len, const char *str)
Definition mallocn.cc:41
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
bool(* MEM_consistency_check)(void)
Definition mallocn.cc:68
void *(* MEM_malloc_arrayN_aligned)(size_t len, size_t size, size_t alignment, const char *str)
Definition mallocn.cc:55
void(* MEM_printmemlist_pydict)(void)
Definition mallocn.cc:63
uint(* MEM_get_memory_blocks_in_use)(void)
Definition mallocn.cc:71
void * aligned_malloc(size_t size, size_t alignment)
Definition mallocn.cc:82
static void assert_for_allocator_change()
Definition mallocn.cc:154
void(* MEM_callbackmemlist)(void(*func)(void *))
Definition mallocn.cc:65
void(* MEM_printmemlist)(void)
Definition mallocn.cc:64
void * MEM_guarded_mallocN_aligned(size_t len, size_t alignment, const char *str, const AllocationType allocation_type)
void * MEM_guarded_calloc_arrayN_aligned(const size_t len, const size_t size, const size_t alignment, const char *str)
size_t MEM_guarded_allocN_len(const void *vmemh)
void * MEM_guarded_mallocN(size_t len, const char *str)
size_t MEM_guarded_get_peak_memory()
void * MEM_guarded_calloc_arrayN(size_t len, size_t size, const char *str)
void MEM_guarded_reset_peak_memory()
void MEM_guarded_freeN(void *vmemh, const AllocationType allocation_type)
void MEM_guarded_set_error_callback(void(*func)(const char *))
bool MEM_guarded_consistency_check()
void MEM_guarded_printmemlist_pydict()
void MEM_guarded_callbackmemlist(void(*func)(void *))
void MEM_guarded_printmemlist()
uint MEM_guarded_get_memory_blocks_in_use()
void * MEM_guarded_callocN(size_t len, const char *str)
void * MEM_guarded_reallocN_id(void *vmemh, size_t len, const char *str)
void MEM_guarded_printmemlist_stats()
void * MEM_guarded_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_guarded_dupallocN(const void *vmemh)
size_t MEM_guarded_get_memory_in_use()
void * MEM_guarded_recallocN_id(void *vmemh, size_t len, const char *str)
void MEM_guarded_name_ptr_set(void *vmemh, const char *str)
void MEM_guarded_set_memory_debug()
const char * MEM_guarded_name_ptr(void *vmemh)
void mem_guarded_clearmemlist()
void * MEM_guarded_malloc_arrayN_aligned(const size_t len, const size_t size, const size_t alignment, const char *str)
void * MEM_lockfree_malloc_arrayN(size_t len, size_t size, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1
void * MEM_lockfree_dupallocN(const void *vmemh) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void MEM_lockfree_freeN(void *vmemh, mem_guarded::internal::AllocationType allocation_type)
void MEM_lockfree_reset_peak_memory(void)
void mem_lockfree_clearmemlist(void)
void MEM_lockfree_name_ptr_set(void *vmemh, const char *str)
void * MEM_lockfree_mallocN_aligned(size_t len, size_t alignment, const char *str, mem_guarded::internal::AllocationType allocation_type) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(3)
void * MEM_lockfree_calloc_arrayN(size_t len, size_t size, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1
void MEM_lockfree_set_error_callback(void(*func)(const char *))
void MEM_lockfree_printmemlist_stats(void)
void MEM_lockfree_set_memory_debug(void)
void * MEM_lockfree_reallocN_id(void *vmemh, size_t len, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(2)
bool MEM_lockfree_consistency_check(void)
void * MEM_lockfree_callocN(size_t len, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2)
void MEM_lockfree_printmemlist_pydict(void)
#define ALIGNED_MALLOC_MINIMUM_ALIGNMENT
void * MEM_lockfree_recallocN_id(void *vmemh, size_t len, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(2)
void * MEM_lockfree_malloc_arrayN_aligned(size_t len, size_t size, size_t alignment, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1
void * MEM_lockfree_mallocN(size_t len, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2)
void MEM_lockfree_printmemlist(void)
size_t MEM_lockfree_allocN_len(const void *vmemh) ATTR_WARN_UNUSED_RESULT
const char * MEM_lockfree_name_ptr(void *vmemh)
void MEM_lockfree_callbackmemlist(void(*func)(void *))
void * MEM_lockfree_calloc_arrayN_aligned(size_t len, size_t size, size_t alignment, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1
size_t MEM_lockfree_get_memory_in_use(void)
unsigned int MEM_lockfree_get_memory_blocks_in_use(void)
size_t MEM_lockfree_get_peak_memory(void) ATTR_WARN_UNUSED_RESULT
void *(* mem_dupallocN)(const void *vmemh) ATTR_WARN_UNUSED_RESULT
Definition mallocn.cc:39
void *(* mem_mallocN)(size_t len, const char *str) ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2)
Definition mallocn.cc:46
void *(* mem_malloc_arrayN)(size_t len, size_t size, const char *str) ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1
Definition mallocn.cc:47
void *(* mem_calloc_arrayN)(size_t len, size_t size, const char *str) ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1
Definition mallocn.cc:43
void(* mem_freeN_ex)(void *vmemh, AllocationType allocation_type)
Definition mallocn.cc:37
void *(* mem_callocN)(size_t len, const char *str) ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2)
Definition mallocn.cc:42
void *(* mem_mallocN_aligned_ex)(size_t len, size_t alignment, const char *str, AllocationType allocation_type)
Definition mallocn.cc:50
uint len
PointerRNA * ptr
Definition wm_files.cc:4238