aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilco Dijkstra <wilco.dijkstra@arm.com>2025-03-31 11:51:44 +0000
committerWilco Dijkstra <wilco.dijkstra@arm.com>2025-04-15 11:14:58 +0000
commit393b1a6e50883e451b31dd4f3fec73e167d14ab4 (patch)
tree3b4d12a57917906540ede6d2544dc4aee8e75fb9
parent9b0c8ced9c71a86f68d3e29693979dad6da3b79d (diff)
downloadglibc-393b1a6e50883e451b31dd4f3fec73e167d14ab4.zip
glibc-393b1a6e50883e451b31dd4f3fec73e167d14ab4.tar.gz
glibc-393b1a6e50883e451b31dd4f3fec73e167d14ab4.tar.bz2
malloc: Inline tcache_free
Inline tcache_free since it's only used by __libc_free. Add __glibc_likely for the tcache checks. Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
-rw-r--r--malloc/malloc.c44
1 files changed, 14 insertions, 30 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 19b6cfa..e74f541 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -3243,34 +3243,6 @@ tcache_double_free_verify (tcache_entry *e, size_t tc_idx)
}
}
-/* Try to free chunk to the tcache, if success return true.
- Caller must ensure that chunk and size are valid. */
-static __always_inline bool
-tcache_free (mchunkptr p, INTERNAL_SIZE_T size)
-{
- bool done = false;
- size_t tc_idx = csize2tidx (size);
- if (tcache != NULL && tc_idx < mp_.tcache_bins)
- {
- /* Check to see if it's already in the tcache. */
- tcache_entry *e = (tcache_entry *) chunk2mem (p);
-
- /* This test succeeds on double free. However, we don't 100%
- trust it (it also matches random payload data at a 1 in
- 2^<size_t> chance), so verify it's not an unlikely
- coincidence before aborting. */
- if (__glibc_unlikely (e->key == tcache_key))
- tcache_double_free_verify (e, tc_idx);
-
- if (tcache->counts[tc_idx] < mp_.tcache_count)
- {
- tcache_put (p, tc_idx);
- done = true;
- }
- }
- return done;
-}
-
static void
tcache_thread_shutdown (void)
{
@@ -3474,8 +3446,20 @@ __libc_free (void *mem)
check_inuse_chunk (arena_for_chunk (p), p);
#if USE_TCACHE
- if (tcache_free (p, size))
- return;
+ size_t tc_idx = csize2tidx (size);
+
+ if (__glibc_likely (tcache != NULL && tc_idx < mp_.tcache_bins))
+ {
+ /* Check to see if it's already in the tcache. */
+ tcache_entry *e = (tcache_entry *) chunk2mem (p);
+
+ /* Check for double free - verify if the key matches. */
+ if (__glibc_unlikely (e->key == tcache_key))
+ tcache_double_free_verify (e, tc_idx);
+
+ if (__glibc_likely (tcache->counts[tc_idx] < mp_.tcache_count))
+ return tcache_put (p, tc_idx);
+ }
#endif
/* Check size >= MINSIZE and p + size does not overflow. */