[PATCH 10/10] Add single-threaded path to _int_malloc
Siddhesh Poyarekar
siddhesh@sourceware.org
Sun Jan 1 00:00:00 GMT 2017
From: Wilco Dijkstra <wdijkstr@arm.com>
This patch adds single-threaded fast paths to _int_malloc.
* malloc/malloc.c (_int_malloc): Add SINGLE_THREAD_P path.
(cherry-picked 905a7725e9157ea522d8ab97b4c8b96aeb23df54)
---
ChangeLog | 4 ++++
malloc/malloc.c | 63 ++++++++++++++++++++++++++++++++++-----------------------
2 files changed, 42 insertions(+), 25 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 75aa92c..1793816 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2017-10-23 Wilco Dijkstra <wdijkstr@arm.com>
+ * malloc/malloc.c (_int_malloc): Add SINGLE_THREAD_P path.
+
+2017-10-23 Wilco Dijkstra <wdijkstr@arm.com>
+
* malloc/malloc.c (__libc_malloc): Add SINGLE_THREAD_P path.
(__libc_realloc): Likewise.
(_mid_memalign): Likewise.
diff --git a/malloc/malloc.c b/malloc/malloc.c
index f8495f3..7783d05 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -3575,37 +3575,50 @@ _int_malloc (mstate av, size_t bytes)
{
idx = fastbin_index (nb);
mfastbinptr *fb = &fastbin (av, idx);
- mchunkptr pp = *fb;
- REMOVE_FB (fb, victim, pp);
- if (victim != 0)
- {
- if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
- malloc_printerr ("malloc(): memory corruption (fast)");
- check_remalloced_chunk (av, victim, nb);
-#if USE_TCACHE
- /* While we're here, if we see other chunks of the same size,
- stash them in the tcache. */
- size_t tc_idx = csize2tidx (nb);
- if (tcache && tc_idx < mp_.tcache_bins)
+ mchunkptr pp;
+ victim = *fb;
+
+ if (victim != NULL)
+ {
+ if (SINGLE_THREAD_P)
+ *fb = victim->fd;
+ else
+ REMOVE_FB (fb, pp, victim);
+ if (__glibc_likely (victim != NULL))
{
- mchunkptr tc_victim;
-
- /* While bin not empty and tcache not full, copy chunks over. */
- while (tcache->counts[tc_idx] < mp_.tcache_count
- && (pp = *fb) != NULL)
+ size_t victim_idx = fastbin_index (chunksize (victim));
+ if (__builtin_expect (victim_idx != idx, 0))
+ malloc_printerr ("malloc(): memory corruption (fast)");
+ check_remalloced_chunk (av, victim, nb);
+#if USE_TCACHE
+ /* While we're here, if we see other chunks of the same size,
+ stash them in the tcache. */
+ size_t tc_idx = csize2tidx (nb);
+ if (tcache && tc_idx < mp_.tcache_bins)
{
- REMOVE_FB (fb, tc_victim, pp);
- if (tc_victim != 0)
+ mchunkptr tc_victim;
+
+ /* While bin not empty and tcache not full, copy chunks. */
+ while (tcache->counts[tc_idx] < mp_.tcache_count
+ && (tc_victim = *fb) != NULL)
{
+ if (SINGLE_THREAD_P)
+ *fb = tc_victim->fd;
+ else
+ {
+ REMOVE_FB (fb, pp, tc_victim);
+ if (__glibc_unlikely (tc_victim == NULL))
+ break;
+ }
tcache_put (tc_victim, tc_idx);
- }
+ }
}
- }
#endif
- void *p = chunk2mem (victim);
- alloc_perturb (p, bytes);
- return p;
- }
+ void *p = chunk2mem (victim);
+ alloc_perturb (p, bytes);
+ return p;
+ }
+ }
}
/*
--
2.7.5
More information about the Libc-stable
mailing list