From dea1e52af38c20eae37ec09727f17ab8fde87f55 Mon Sep 17 00:00:00 2001 From: Wilco Dijkstra Date: Wed, 28 May 2025 15:17:43 +0000 Subject: [PATCH] malloc: Cleanup libc_realloc Minor cleanup of libc_realloc: remove unnecessary special cases for mmap, move ar_ptr initialization, first check for oldmem == NULL. --- malloc/malloc.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/malloc/malloc.c b/malloc/malloc.c index 3113a133c8..151e6c615e 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -3501,17 +3501,17 @@ __libc_realloc (void *oldmem, size_t bytes) void *newp; /* chunk to return */ + /* realloc of null is supposed to be same as malloc */ + if (oldmem == NULL) + return __libc_malloc (bytes); + #if REALLOC_ZERO_BYTES_FREES - if (bytes == 0 && oldmem != NULL) + if (bytes == 0) { __libc_free (oldmem); return NULL; } #endif - /* realloc of null is supposed to be same as malloc */ - if (oldmem == NULL) - return __libc_malloc (bytes); - /* Perform a quick check to ensure that the pointer's tag matches the memory's tag. */ if (__glibc_unlikely (mtag_enabled)) @@ -3529,19 +3529,13 @@ __libc_realloc (void *oldmem, size_t bytes) if (bytes <= usable) { size_t difference = usable - bytes; - if ((unsigned long) difference < 2 * sizeof (INTERNAL_SIZE_T) - || (chunk_is_mmapped (oldp) && difference <= GLRO (dl_pagesize))) + if ((unsigned long) difference < 2 * sizeof (INTERNAL_SIZE_T)) return oldmem; } /* its size */ const INTERNAL_SIZE_T oldsize = chunksize (oldp); - if (chunk_is_mmapped (oldp)) - ar_ptr = NULL; - else - ar_ptr = arena_for_chunk (oldp); - /* Little security check which won't hurt performance: the allocator never wraps around at the end of the address space. Therefore we can exclude some size values which might appear here by @@ -3574,9 +3568,9 @@ __libc_realloc (void *oldmem, size_t bytes) return tag_new_usable (newmem); } #endif - /* Note the extra SIZE_SZ overhead. */ - if (oldsize - SIZE_SZ >= nb) - return oldmem; /* do nothing */ + /* Return if shrinking and mremap was unsuccessful. */ + if (bytes <= usable) + return oldmem; /* Must alloc, copy, free. */ newmem = __libc_malloc (bytes); @@ -3588,6 +3582,8 @@ __libc_realloc (void *oldmem, size_t bytes) return newmem; } + ar_ptr = arena_for_chunk (oldp); + if (SINGLE_THREAD_P) { newp = _int_realloc (ar_ptr, oldp, oldsize, nb); -- 2.47.2