diff options
Diffstat (limited to 'intern/guardedalloc/intern/mallocn_lockfree_impl.c')
-rw-r--r-- | intern/guardedalloc/intern/mallocn_lockfree_impl.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/intern/guardedalloc/intern/mallocn_lockfree_impl.c b/intern/guardedalloc/intern/mallocn_lockfree_impl.c index ce8a5b29ece..4c6ba0cb256 100644 --- a/intern/guardedalloc/intern/mallocn_lockfree_impl.c +++ b/intern/guardedalloc/intern/mallocn_lockfree_impl.c @@ -64,9 +64,9 @@ enum { MEMHEAD_ALIGN_FLAG = 2, }; -#define MEMHEAD_FROM_PTR(ptr) (((MemHead*) vmemh) - 1) +#define MEMHEAD_FROM_PTR(ptr) (((MemHead*) ptr) - 1) #define PTR_FROM_MEMHEAD(memhead) (memhead + 1) -#define MEMHEAD_ALIGNED_FROM_PTR(ptr) (((MemHeadAligned*) vmemh) - 1) +#define MEMHEAD_ALIGNED_FROM_PTR(ptr) (((MemHeadAligned*) ptr) - 1) #define MEMHEAD_IS_MMAP(memhead) ((memhead)->len & (size_t) MEMHEAD_MMAP_FLAG) #define MEMHEAD_IS_ALIGNED(memhead) ((memhead)->len & (size_t) MEMHEAD_ALIGN_FLAG) @@ -76,12 +76,7 @@ enum { MEM_INLINE void update_maximum(size_t *maximum_value, size_t value) { #ifdef USE_ATOMIC_MAX - size_t prev_value = *maximum_value; - while (prev_value < value) { - if (atomic_cas_z(maximum_value, prev_value, value) != prev_value) { - break; - } - } + atomic_fetch_and_update_max_z(maximum_value, value); #else *maximum_value = value > *maximum_value ? value : *maximum_value; #endif @@ -298,6 +293,21 @@ void *MEM_lockfree_callocN(size_t len, const char *str) return NULL; } +void *MEM_lockfree_calloc_arrayN(size_t len, size_t size, const char *str) +{ + size_t total_size; + if (UNLIKELY(!MEM_size_safe_multiply(len, size, &total_size))) { + print_error("Calloc array aborted due to integer overflow: " + "len=" SIZET_FORMAT "x" SIZET_FORMAT " in %s, total %u\n", + SIZET_ARG(len), SIZET_ARG(size), str, + (unsigned int) mem_in_use); + abort(); + return NULL; + } + + return MEM_lockfree_callocN(total_size, str); +} + void *MEM_lockfree_mallocN(size_t len, const char *str) { MemHead *memh; @@ -323,6 +333,21 @@ void *MEM_lockfree_mallocN(size_t len, const char *str) return NULL; } +void *MEM_lockfree_malloc_arrayN(size_t len, size_t size, const char *str) +{ + size_t total_size; + if (UNLIKELY(!MEM_size_safe_multiply(len, size, &total_size))) { + print_error("Malloc array aborted due to integer overflow: " + "len=" SIZET_FORMAT "x" SIZET_FORMAT " in %s, total %u\n", + SIZET_ARG(len), SIZET_ARG(size), str, + (unsigned int) mem_in_use); + abort(); + return NULL; + } + + return MEM_lockfree_mallocN(total_size, str); +} + void *MEM_lockfree_mallocN_aligned(size_t len, size_t alignment, const char *str) { MemHeadAligned *memh; @@ -444,7 +469,7 @@ void MEM_lockfree_set_error_callback(void (*func)(const char *)) error_callback = func; } -bool MEM_lockfree_check_memory_integrity(void) +bool MEM_lockfree_consistency_check(void) { return true; } |