1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

Add single-threaded path to _int_malloc

This patch adds single-threaded fast paths to _int_malloc.

	* malloc/malloc.c (_int_malloc): Add SINGLE_THREAD_P path.
This commit is contained in:
Wilco Dijkstra
2017-10-24 12:43:05 +01:00
parent 3f6bb8a32e
commit 905a7725e9
2 changed files with 42 additions and 25 deletions

View File

@ -1,3 +1,7 @@
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> 2017-10-23 Wilco Dijkstra <wdijkstr@arm.com>
* malloc/malloc.c (__libc_malloc): Add SINGLE_THREAD_P path. * malloc/malloc.c (__libc_malloc): Add SINGLE_THREAD_P path.

View File

@ -3568,11 +3568,19 @@ _int_malloc (mstate av, size_t bytes)
{ {
idx = fastbin_index (nb); idx = fastbin_index (nb);
mfastbinptr *fb = &fastbin (av, idx); mfastbinptr *fb = &fastbin (av, idx);
mchunkptr pp = *fb; mchunkptr pp;
REMOVE_FB (fb, victim, pp); victim = *fb;
if (victim != 0)
if (victim != NULL)
{ {
if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0)) if (SINGLE_THREAD_P)
*fb = victim->fd;
else
REMOVE_FB (fb, pp, victim);
if (__glibc_likely (victim != NULL))
{
size_t victim_idx = fastbin_index (chunksize (victim));
if (__builtin_expect (victim_idx != idx, 0))
malloc_printerr ("malloc(): memory corruption (fast)"); malloc_printerr ("malloc(): memory corruption (fast)");
check_remalloced_chunk (av, victim, nb); check_remalloced_chunk (av, victim, nb);
#if USE_TCACHE #if USE_TCACHE
@ -3583,15 +3591,19 @@ _int_malloc (mstate av, size_t bytes)
{ {
mchunkptr tc_victim; mchunkptr tc_victim;
/* While bin not empty and tcache not full, copy chunks over. */ /* While bin not empty and tcache not full, copy chunks. */
while (tcache->counts[tc_idx] < mp_.tcache_count while (tcache->counts[tc_idx] < mp_.tcache_count
&& (pp = *fb) != NULL) && (tc_victim = *fb) != NULL)
{ {
REMOVE_FB (fb, tc_victim, pp); if (SINGLE_THREAD_P)
if (tc_victim != 0) *fb = tc_victim->fd;
else
{ {
tcache_put (tc_victim, tc_idx); REMOVE_FB (fb, pp, tc_victim);
if (__glibc_unlikely (tc_victim == NULL))
break;
} }
tcache_put (tc_victim, tc_idx);
} }
} }
#endif #endif
@ -3600,6 +3612,7 @@ _int_malloc (mstate av, size_t bytes)
return p; return p;
} }
} }
}
/* /*
If a small request, check regular bin. Since these "smallbins" If a small request, check regular bin. Since these "smallbins"