[PATCH] malloc: Cleanup libc_realloc
Wilco Dijkstra
Wilco.Dijkstra@arm.com
Tue Jul 29 15:22:52 GMT 2025
Minor cleanup of libc_realloc: remove unnecessary special cases for mmap, move
ar_ptr initialization, first check for oldmem == NULL.
Passes regress, OK for commit?
---
diff --git a/malloc/malloc.c b/malloc/malloc.c
index ee4ea71d7323bf54da708c9af5fb7d2bcc2a33b5..5e08a12429951ae815de9cc007c00c89a25f3627 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -3571,17 +3571,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))
@@ -3599,19 +3599,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
@@ -3644,10 +3638,6 @@ __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 */
-
/* Must alloc, copy, free. */
newmem = __libc_malloc (bytes);
if (newmem == NULL)
@@ -3658,6 +3648,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);
More information about the Libc-alpha
mailing list