diff options
Diffstat (limited to 'intern/guardedalloc/intern')
-rw-r--r-- | intern/guardedalloc/intern/mallocn.c | 7 | ||||
-rw-r--r-- | intern/guardedalloc/intern/mallocn_guarded_impl.c | 15 | ||||
-rw-r--r-- | intern/guardedalloc/intern/mallocn_intern.h | 16 | ||||
-rw-r--r-- | intern/guardedalloc/intern/mallocn_lockfree_impl.c | 18 |
4 files changed, 35 insertions, 21 deletions
diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c index be0a8aadf84..1fd85a0c9f5 100644 --- a/intern/guardedalloc/intern/mallocn.c +++ b/intern/guardedalloc/intern/mallocn.c @@ -17,6 +17,7 @@ * * Contributor(s): Brecht Van Lommel * Campbell Barton + * Sergey Sharybin * * ***** END GPL LICENSE BLOCK ***** */ @@ -53,11 +54,11 @@ void (*MEM_set_error_callback)(void (*func)(const char *)) = MEM_lockfree_set_er bool (*MEM_check_memory_integrity)(void) = MEM_lockfree_check_memory_integrity; void (*MEM_set_lock_callback)(void (*lock)(void), void (*unlock)(void)) = MEM_lockfree_set_lock_callback; void (*MEM_set_memory_debug)(void) = MEM_lockfree_set_memory_debug; -uintptr_t (*MEM_get_memory_in_use)(void) = MEM_lockfree_get_memory_in_use; -uintptr_t (*MEM_get_mapped_memory_in_use)(void) = MEM_lockfree_get_mapped_memory_in_use; +size_t (*MEM_get_memory_in_use)(void) = MEM_lockfree_get_memory_in_use; +size_t (*MEM_get_mapped_memory_in_use)(void) = MEM_lockfree_get_mapped_memory_in_use; unsigned int (*MEM_get_memory_blocks_in_use)(void) = MEM_lockfree_get_memory_blocks_in_use; void (*MEM_reset_peak_memory)(void) = MEM_lockfree_reset_peak_memory; -uintptr_t (*MEM_get_peak_memory)(void) = MEM_lockfree_get_peak_memory; +size_t (*MEM_get_peak_memory)(void) = MEM_lockfree_get_peak_memory; #ifndef NDEBUG const char *(*MEM_name_ptr)(void *vmemh) = MEM_lockfree_name_ptr; diff --git a/intern/guardedalloc/intern/mallocn_guarded_impl.c b/intern/guardedalloc/intern/mallocn_guarded_impl.c index 10781a9cc54..1933e9d3ee3 100644 --- a/intern/guardedalloc/intern/mallocn_guarded_impl.c +++ b/intern/guardedalloc/intern/mallocn_guarded_impl.c @@ -22,6 +22,7 @@ * * Contributor(s): Brecht Van Lommel * Campbell Barton + * Sergey Sharybin * * ***** END GPL LICENSE BLOCK ***** */ @@ -710,10 +711,12 @@ void MEM_guarded_printmemlist_stats(void) totpb++; pb++; - if (!membl->mmap) { +#ifdef USE_MALLOC_USABLE_SIZE + if (!membl->mmap && membl->alignment == 0) { mem_in_use_slop += (sizeof(MemHead) + sizeof(MemTail) + malloc_usable_size((void *)membl)) - membl->len; } +#endif if (membl->next) membl = MEMNEXT(membl->next); @@ -1147,13 +1150,13 @@ size_t MEM_guarded_get_peak_memory(void) void MEM_guarded_reset_peak_memory(void) { mem_lock_thread(); - peak_mem = 0; + peak_mem = mem_in_use; mem_unlock_thread(); } -uintptr_t MEM_guarded_get_memory_in_use(void) +size_t MEM_guarded_get_memory_in_use(void) { - uintptr_t _mem_in_use; + size_t _mem_in_use; mem_lock_thread(); _mem_in_use = mem_in_use; @@ -1162,9 +1165,9 @@ uintptr_t MEM_guarded_get_memory_in_use(void) return _mem_in_use; } -uintptr_t MEM_guarded_get_mapped_memory_in_use(void) +size_t MEM_guarded_get_mapped_memory_in_use(void) { - uintptr_t _mmap_in_use; + size_t _mmap_in_use; mem_lock_thread(); _mmap_in_use = mmap_in_use; diff --git a/intern/guardedalloc/intern/mallocn_intern.h b/intern/guardedalloc/intern/mallocn_intern.h index 7da74f7cc4c..3f7e462c1c7 100644 --- a/intern/guardedalloc/intern/mallocn_intern.h +++ b/intern/guardedalloc/intern/mallocn_intern.h @@ -50,6 +50,7 @@ #endif #undef HAVE_MALLOC_STATS +#define USE_MALLOC_USABLE_SIZE /* internal, when we have malloc_usable_size() */ #if defined(__linux__) || (defined(__FreeBSD_kernel__) && !defined(__FreeBSD__)) || defined(__GLIBC__) # include <malloc.h> @@ -63,7 +64,8 @@ # include <malloc.h> # define malloc_usable_size _msize #else -# error "We don't know how to use malloc_usable_size on your platform" +# pragma message "We don't know how to use malloc_usable_size on your platform" +# undef USE_MALLOC_USABLE_SIZE #endif /* Blame Microsoft for LLP64 and no inttypes.h, quick workaround needed: */ @@ -139,11 +141,11 @@ void MEM_lockfree_set_error_callback(void (*func)(const char *)); bool MEM_lockfree_check_memory_integrity(void); void MEM_lockfree_set_lock_callback(void (*lock)(void), void (*unlock)(void)); void MEM_lockfree_set_memory_debug(void); -uintptr_t MEM_lockfree_get_memory_in_use(void); -uintptr_t MEM_lockfree_get_mapped_memory_in_use(void); +size_t MEM_lockfree_get_memory_in_use(void); +size_t MEM_lockfree_get_mapped_memory_in_use(void); unsigned int MEM_lockfree_get_memory_blocks_in_use(void); void MEM_lockfree_reset_peak_memory(void); -uintptr_t MEM_lockfree_get_peak_memory(void) ATTR_WARN_UNUSED_RESULT; +size_t MEM_lockfree_get_peak_memory(void) ATTR_WARN_UNUSED_RESULT; #ifndef NDEBUG const char *MEM_lockfree_name_ptr(void *vmemh); #endif @@ -166,11 +168,11 @@ void MEM_guarded_set_error_callback(void (*func)(const char *)); bool MEM_guarded_check_memory_integrity(void); void MEM_guarded_set_lock_callback(void (*lock)(void), void (*unlock)(void)); void MEM_guarded_set_memory_debug(void); -uintptr_t MEM_guarded_get_memory_in_use(void); -uintptr_t MEM_guarded_get_mapped_memory_in_use(void); +size_t MEM_guarded_get_memory_in_use(void); +size_t MEM_guarded_get_mapped_memory_in_use(void); unsigned int MEM_guarded_get_memory_blocks_in_use(void); void MEM_guarded_reset_peak_memory(void); -uintptr_t MEM_guarded_get_peak_memory(void) ATTR_WARN_UNUSED_RESULT; +size_t MEM_guarded_get_peak_memory(void) ATTR_WARN_UNUSED_RESULT; #ifndef NDEBUG const char *MEM_guarded_name_ptr(void *vmemh); #endif diff --git a/intern/guardedalloc/intern/mallocn_lockfree_impl.c b/intern/guardedalloc/intern/mallocn_lockfree_impl.c index c0f6aeeaa9d..a80d67c3e80 100644 --- a/intern/guardedalloc/intern/mallocn_lockfree_impl.c +++ b/intern/guardedalloc/intern/mallocn_lockfree_impl.c @@ -71,7 +71,7 @@ enum { #define MEMHEAD_IS_ALIGNED(memhead) ((memhead)->len & (size_t) MEMHEAD_ALIGN_FLAG) /* Uncomment this to have proper peak counter. */ -//#define USE_ATOMIC_MAX +#define USE_ATOMIC_MAX MEM_INLINE void update_maximum(size_t *maximum_value, size_t value) { @@ -134,6 +134,14 @@ void MEM_lockfree_freeN(void *vmemh) MemHead *memh = MEMHEAD_FROM_PTR(vmemh); size_t len = MEM_lockfree_allocN_len(vmemh); + if (vmemh == NULL) { + print_error("Attempt to free NULL pointer\n"); +#ifdef WITH_ASSERT_ABORT + abort(); +#endif + return; + } + atomic_sub_u(&totblock, 1); atomic_sub_z(&mem_in_use, len); @@ -452,12 +460,12 @@ void MEM_lockfree_set_memory_debug(void) malloc_debug_memset = true; } -uintptr_t MEM_lockfree_get_memory_in_use(void) +size_t MEM_lockfree_get_memory_in_use(void) { return mem_in_use; } -uintptr_t MEM_lockfree_get_mapped_memory_in_use(void) +size_t MEM_lockfree_get_mapped_memory_in_use(void) { return mmap_in_use; } @@ -470,10 +478,10 @@ unsigned int MEM_lockfree_get_memory_blocks_in_use(void) /* dummy */ void MEM_lockfree_reset_peak_memory(void) { - peak_mem = 0; + peak_mem = mem_in_use; } -uintptr_t MEM_lockfree_get_peak_memory(void) +size_t MEM_lockfree_get_peak_memory(void) { return peak_mem; } |