diff options
author | Wilco Dijkstra <wilco.dijkstra@arm.com> | 2025-05-28 15:17:43 +0000 |
---|---|---|
committer | Wilco Dijkstra <wilco.dijkstra@arm.com> | 2025-08-04 17:13:55 +0000 |
commit | dea1e52af38c20eae37ec09727f17ab8fde87f55 (patch) | |
tree | 7c45a0d42eb4148caa8b59f4fdd9535f0fe33654 | |
parent | 4b74591022e88639dcaefb8c4a2e405d301a59e2 (diff) | |
download | glibc-dea1e52af38c20eae37ec09727f17ab8fde87f55.zip glibc-dea1e52af38c20eae37ec09727f17ab8fde87f55.tar.gz glibc-dea1e52af38c20eae37ec09727f17ab8fde87f55.tar.bz2 |
malloc: Cleanup libc_realloc
Minor cleanup of libc_realloc: remove unnecessary special cases for mmap, move
ar_ptr initialization, first check for oldmem == NULL.
-rw-r--r-- | malloc/malloc.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c index 3113a13..151e6c6 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); |