Blender  V3.3
mallocn.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
9 #include "MEM_guardedalloc.h"
10 
11 /* to ensure strict conversions */
12 #include "../../source/blender/blenlib/BLI_strict_flags.h"
13 
14 #include <assert.h>
15 
16 #include "mallocn_intern.h"
17 
18 #ifdef WITH_JEMALLOC_CONF
19 /* If jemalloc is used, it reads this global variable and enables background
20  * threads to purge dirty pages. Otherwise we release memory too slowly or not
21  * at all if the thread that did the allocation stays inactive. */
22 const char *malloc_conf = "background_thread:true,dirty_decay_ms:4000";
23 #endif
24 
25 /* NOTE: Keep in sync with MEM_use_lockfree_allocator(). */
26 size_t (*MEM_allocN_len)(const void *vmemh) = MEM_lockfree_allocN_len;
27 void (*MEM_freeN)(void *vmemh) = MEM_lockfree_freeN;
28 void *(*MEM_dupallocN)(const void *vmemh) = MEM_lockfree_dupallocN;
29 void *(*MEM_reallocN_id)(void *vmemh, size_t len, const char *str) = MEM_lockfree_reallocN_id;
30 void *(*MEM_recallocN_id)(void *vmemh, size_t len, const char *str) = MEM_lockfree_recallocN_id;
31 void *(*MEM_callocN)(size_t len, const char *str) = MEM_lockfree_callocN;
32 void *(*MEM_calloc_arrayN)(size_t len, size_t size, const char *str) = MEM_lockfree_calloc_arrayN;
33 void *(*MEM_mallocN)(size_t len, const char *str) = MEM_lockfree_mallocN;
34 void *(*MEM_malloc_arrayN)(size_t len, size_t size, const char *str) = MEM_lockfree_malloc_arrayN;
35 void *(*MEM_mallocN_aligned)(size_t len,
36  size_t alignment,
37  const char *str) = MEM_lockfree_mallocN_aligned;
49 
50 #ifndef NDEBUG
51 const char *(*MEM_name_ptr)(void *vmemh) = MEM_lockfree_name_ptr;
52 #endif
53 
54 void *aligned_malloc(size_t size, size_t alignment)
55 {
56  /* #posix_memalign requires alignment to be a multiple of `sizeof(void *)`. */
57  assert(alignment >= ALIGNED_MALLOC_MINIMUM_ALIGNMENT);
58 
59 #ifdef _WIN32
60  return _aligned_malloc(size, alignment);
61 #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
62  void *result;
63 
64  if (posix_memalign(&result, alignment, size)) {
65  /* non-zero means allocation error
66  * either no allocation or bad alignment value
67  */
68  return NULL;
69  }
70  return result;
71 #else /* This is for Linux. */
72  return memalign(alignment, size);
73 #endif
74 }
75 
76 void aligned_free(void *ptr)
77 {
78 #ifdef _WIN32
79  _aligned_free(ptr);
80 #else
81  free(ptr);
82 #endif
83 }
84 
85 /* Perform assert checks on allocator type change.
86  *
87  * Helps catching issues (in debug build) caused by an unintended allocator type change when there
88  * are allocation happened. */
89 static void assert_for_allocator_change(void)
90 {
91  /* NOTE: Assume that there is no "sticky" internal state which would make switching allocator
92  * type after all allocations are freed unsafe. In fact, it should be safe to change allocator
93  * type after all blocks has been freed: some regression tests do rely on this property of
94  * allocators. */
95  assert(MEM_get_memory_blocks_in_use() == 0);
96 }
97 
99 {
100  /* NOTE: Keep in sync with static initialization of the variables. */
101 
102  /* TODO(sergey): Find a way to de-duplicate the logic. Maybe by requiring an explicit call
103  * to guarded allocator initialization at an application startup. */
104 
106 
128 
129 #ifndef NDEBUG
131 #endif
132 }
133 
135 {
137 
159 
160 #ifndef NDEBUG
162 #endif
163 }
void BLI_kdtree_nd_() free(KDTree *tree)
Definition: kdtree_impl.h:102
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
SyclQueue void void size_t num_bytes void
int len
Definition: draw_manager.c:108
#define str(s)
void MEM_use_guarded_allocator(void)
Definition: mallocn.c:134
size_t(* MEM_get_peak_memory)(void)
Definition: mallocn.c:48
void aligned_free(void *ptr)
Definition: mallocn.c:76
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:34
void * aligned_malloc(size_t size, size_t alignment)
Definition: mallocn.c:54
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void(* MEM_reset_peak_memory)(void)
Definition: mallocn.c:47
size_t(* MEM_get_memory_in_use)(void)
Definition: mallocn.c:45
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:28
void *(* MEM_mallocN_aligned)(size_t len, size_t alignment, const char *str)
Definition: mallocn.c:35
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:32
void(* MEM_printmemlist_stats)(void)
Definition: mallocn.c:41
void(* MEM_set_memory_debug)(void)
Definition: mallocn.c:44
void(* MEM_set_error_callback)(void(*func)(const char *))
Definition: mallocn.c:42
void *(* MEM_reallocN_id)(void *vmemh, size_t len, const char *str)
Definition: mallocn.c:29
size_t(* MEM_allocN_len)(const void *vmemh)
Definition: mallocn.c:26
void MEM_use_lockfree_allocator(void)
Definition: mallocn.c:98
bool(* MEM_consistency_check)(void)
Definition: mallocn.c:43
const char *(* MEM_name_ptr)(void *vmemh)
Definition: mallocn.c:51
void *(* MEM_recallocN_id)(void *vmemh, size_t len, const char *str)
Definition: mallocn.c:30
unsigned int(* MEM_get_memory_blocks_in_use)(void)
Definition: mallocn.c:46
void(* MEM_printmemlist_pydict)(void)
Definition: mallocn.c:38
static void assert_for_allocator_change(void)
Definition: mallocn.c:89
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:33
void(* MEM_callbackmemlist)(void(*func)(void *))
Definition: mallocn.c:40
void(* MEM_printmemlist)(void)
Definition: mallocn.c:39
size_t MEM_guarded_allocN_len(const void *vmemh)
const char * MEM_guarded_name_ptr(void *vmemh)
unsigned int MEM_guarded_get_memory_blocks_in_use(void)
void * MEM_guarded_callocN(size_t len, const char *str)
void * MEM_guarded_dupallocN(const void *vmemh)
void * MEM_guarded_calloc_arrayN(size_t len, size_t size, const char *str)
void MEM_guarded_set_error_callback(void(*func)(const char *))
void MEM_guarded_printmemlist(void)
void MEM_guarded_printmemlist_pydict(void)
void MEM_guarded_callbackmemlist(void(*func)(void *))
bool MEM_guarded_consistency_check(void)
void MEM_guarded_set_memory_debug(void)
void MEM_guarded_printmemlist_stats(void)
size_t MEM_guarded_get_peak_memory(void)
void * MEM_guarded_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_guarded_mallocN(size_t len, const char *str)
void * MEM_guarded_mallocN_aligned(size_t len, size_t alignment, const char *str)
void * MEM_guarded_reallocN_id(void *vmemh, size_t len, const char *str)
void * MEM_guarded_recallocN_id(void *vmemh, size_t len, const char *str)
void MEM_guarded_reset_peak_memory(void)
size_t MEM_guarded_get_memory_in_use(void)
void MEM_guarded_freeN(void *vmemh)
void * MEM_lockfree_mallocN_aligned(size_t len, size_t alignment, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(3)
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_reallocN_id(void *vmemh, size_t len, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(2)
void MEM_lockfree_reset_peak_memory(void)
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_set_error_callback(void(*func)(const char *))
void MEM_lockfree_printmemlist_stats(void)
void MEM_lockfree_set_memory_debug(void)
void * MEM_lockfree_callocN(size_t len, const char *str) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2)
bool MEM_lockfree_consistency_check(void)
void * MEM_lockfree_dupallocN(const void *vmemh) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
const char * MEM_lockfree_name_ptr(void *vmemh)
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_printmemlist_pydict(void)
#define ALIGNED_MALLOC_MINIMUM_ALIGNMENT
void MEM_lockfree_printmemlist(void)
void MEM_lockfree_freeN(void *vmemh)
size_t MEM_lockfree_allocN_len(const void *vmemh) ATTR_WARN_UNUSED_RESULT
void MEM_lockfree_callbackmemlist(void(*func)(void *))
void * MEM_lockfree_calloc_arrayN(size_t len, size_t size, 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
PointerRNA * ptr
Definition: wm_files.c:3480