diff --git a/include/my_sys.h b/include/my_sys.h index 26ac0865e3f..4e4dc5c6c3f 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -160,6 +160,7 @@ extern my_thread_id (*sf_malloc_dbug_id)(void); typedef void (*MALLOC_SIZE_CB) (long long size, my_bool is_thread_specific); extern void set_malloc_size_cb(MALLOC_SIZE_CB func); +extern MALLOC_SIZE_CB update_malloc_size; /* defines when allocating data */ extern void *my_malloc(PSI_memory_key key, size_t size, myf MyFlags); diff --git a/mysys/my_largepage.c b/mysys/my_largepage.c index c5fc2a1264e..07859db2fed 100644 --- a/mysys/my_largepage.c +++ b/mysys/my_largepage.c @@ -398,6 +398,7 @@ uchar *my_large_malloc(size_t *size, myf my_flags) if (ptr != NULL) { MEM_MAKE_DEFINED(ptr, *size); + update_malloc_size(*size, 0); } DBUG_RETURN(ptr); @@ -430,31 +431,36 @@ void my_large_free(void *ptr, size_t size) { my_error(EE_BADMEMORYRELEASE, MYF(ME_ERROR_LOG_ONLY), ptr, size, errno); } -# if !__has_feature(memory_sanitizer) +#if !__has_feature(memory_sanitizer) else { MEM_MAKE_ADDRESSABLE(ptr, size); } -# endif +#endif + update_malloc_size(- (longlong) size, 0); #elif defined(_WIN32) /* When RELEASE memory, the size parameter must be 0. Do not use MEM_RELEASE with MEM_DECOMMIT. */ - if (ptr && !VirtualFree(ptr, 0, MEM_RELEASE)) + if (ptr) { - my_error(EE_BADMEMORYRELEASE, MYF(ME_ERROR_LOG_ONLY), ptr, size, - GetLastError()); + if (!VirtualFree(ptr, 0, MEM_RELEASE)) + { + my_error(EE_BADMEMORYRELEASE, MYF(ME_ERROR_LOG_ONLY), ptr, size, + GetLastError()); + } + update_malloc_size(- (longlong) size, 0); } -# if !__has_feature(memory_sanitizer) +#if !__has_feature(memory_sanitizer) else { MEM_MAKE_ADDRESSABLE(ptr, size); } -# endif +#endif /* memory_sanitizer */ #else my_free_lock(ptr); -#endif +#endif /* HAVE_MMMAP */ DBUG_VOID_RETURN; } diff --git a/mysys/my_lockmem.c b/mysys/my_lockmem.c index 732aef1fdac..8d416c07549 100644 --- a/mysys/my_lockmem.c +++ b/mysys/my_lockmem.c @@ -32,7 +32,7 @@ struct st_mem_list LIST *mem_list; -uchar *my_malloc_lock(uint size,myf MyFlags) +uchar *my_malloc_lock(size_t size, myf MyFlags) { int success; uint pagesize=sysconf(_SC_PAGESIZE); @@ -70,6 +70,7 @@ uchar *my_malloc_lock(uint size,myf MyFlags) mysql_mutex_lock(&THR_LOCK_malloc); mem_list=list_add(mem_list,&element->list); mysql_mutex_unlock(&THR_LOCK_malloc); + update_malloc_size((longlong) size, 0); } DBUG_RETURN(ptr); } @@ -88,6 +89,7 @@ void my_free_lock(uchar *ptr) { /* Found locked mem */ (void) munlock((uchar*) ptr,element->size); mem_list=list_delete(mem_list,list); + update_malloc_size(- (longlong) element->size, 0); break; } } diff --git a/mysys/my_malloc.c b/mysys/my_malloc.c index c32831ed20d..cce6c348057 100644 --- a/mysys/my_malloc.c +++ b/mysys/my_malloc.c @@ -48,7 +48,7 @@ static void dummy(long long size __attribute__((unused)), my_bool is_thread_specific __attribute__((unused))) {} -static MALLOC_SIZE_CB update_malloc_size= dummy; +MALLOC_SIZE_CB update_malloc_size= dummy; void set_malloc_size_cb(MALLOC_SIZE_CB func) {