malloc: Convert the unlink macro to the unlink_chunk function

This commit is in preparation of turning the macro into a proper
function.  The output arguments of the macro were in fact unused.

Also clean up uses of __builtin_expect.
This commit is contained in:
Florian Weimer 2018-11-12 14:15:14 +01:00
parent 278fdabd8c
commit 1ecba1fafc
3 changed files with 62 additions and 47 deletions

View file

@ -1,3 +1,16 @@
2018-11-12 Florian Weimer <fweimer@redhat.com>
* malloc/malloc.c (unlink_chunk): Turn the unlink macro into this
function. Move after the definition of in_smallbin_range. Do not
use __builtin_expect for paths that lead to a noreturn function.
Drop remaining __builtin_expect (p->fd_nextsize != NULL, 0)
because it is unclear whether this is in fact an unlikely
condition.
(_int_malloc, _int_free): Adjust.
(malloc_consolidate, _int_realloc): Adjust. Remove bck, fwd
variables.
* malloc/arena.c (heap_trim): Likewise.
2018-11-10 Samuel Thibault <samuel.thibault@ens-lyon.org>
* sysdeps/mach/hurd/spawni.c (__spawni): Add ccwdir port. Test and use

View file

@ -596,7 +596,7 @@ heap_trim (heap_info *heap, size_t pad)
{
mstate ar_ptr = heap->ar_ptr;
unsigned long pagesz = GLRO (dl_pagesize);
mchunkptr top_chunk = top (ar_ptr), p, bck, fwd;
mchunkptr top_chunk = top (ar_ptr), p;
heap_info *prev_heap;
long new_size, top_size, top_area, extra, prev_size, misalign;
@ -625,7 +625,7 @@ heap_trim (heap_info *heap, size_t pad)
if (!prev_inuse (p)) /* consolidate backward */
{
p = prev_chunk (p);
unlink (ar_ptr, p, bck, fwd);
unlink_chunk (ar_ptr, p);
}
assert (((unsigned long) ((char *) p + new_size) & (pagesz - 1)) == 0);
assert (((char *) p + new_size) == ((char *) heap + heap->size));

View file

@ -1384,39 +1384,6 @@ typedef struct malloc_chunk *mbinptr;
#define first(b) ((b)->fd)
#define last(b) ((b)->bk)
/* Take a chunk off a bin list */
#define unlink(AV, P, BK, FD) { \
if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0)) \
malloc_printerr ("corrupted size vs. prev_size"); \
FD = P->fd; \
BK = P->bk; \
if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \
malloc_printerr ("corrupted double-linked list"); \
else { \
FD->bk = BK; \
BK->fd = FD; \
if (!in_smallbin_range (chunksize_nomask (P)) \
&& __builtin_expect (P->fd_nextsize != NULL, 0)) { \
if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0) \
|| __builtin_expect (P->bk_nextsize->fd_nextsize != P, 0)) \
malloc_printerr ("corrupted double-linked list (not small)"); \
if (FD->fd_nextsize == NULL) { \
if (P->fd_nextsize == P) \
FD->fd_nextsize = FD->bk_nextsize = FD; \
else { \
FD->fd_nextsize = P->fd_nextsize; \
FD->bk_nextsize = P->bk_nextsize; \
P->fd_nextsize->bk_nextsize = FD; \
P->bk_nextsize->fd_nextsize = FD; \
} \
} else { \
P->fd_nextsize->bk_nextsize = P->bk_nextsize; \
P->bk_nextsize->fd_nextsize = P->fd_nextsize; \
} \
} \
} \
}
/*
Indexing
@ -1489,6 +1456,46 @@ typedef struct malloc_chunk *mbinptr;
#define bin_index(sz) \
((in_smallbin_range (sz)) ? smallbin_index (sz) : largebin_index (sz))
/* Take a chunk off a bin list. */
static void
unlink_chunk (mstate av, mchunkptr p)
{
if (chunksize (p) != prev_size (next_chunk (p)))
malloc_printerr ("corrupted size vs. prev_size");
mchunkptr fd = p->fd;
mchunkptr bk = p->bk;
if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
malloc_printerr ("corrupted double-linked list");
fd->bk = bk;
bk->fd = fd;
if (!in_smallbin_range (chunksize_nomask (p)) && p->fd_nextsize != NULL)
{
if (p->fd_nextsize->bk_nextsize != p
|| p->bk_nextsize->fd_nextsize != p)
malloc_printerr ("corrupted double-linked list (not small)");
if (fd->fd_nextsize == NULL)
{
if (p->fd_nextsize == p)
fd->fd_nextsize = fd->bk_nextsize = fd;
else
{
fd->fd_nextsize = p->fd_nextsize;
fd->bk_nextsize = p->bk_nextsize;
p->fd_nextsize->bk_nextsize = fd;
p->bk_nextsize->fd_nextsize = fd;
}
}
else
{
p->fd_nextsize->bk_nextsize = p->bk_nextsize;
p->bk_nextsize->fd_nextsize = p->fd_nextsize;
}
}
}
/*
Unsorted chunks
@ -3920,7 +3927,7 @@ _int_malloc (mstate av, size_t bytes)
victim = victim->fd;
remainder_size = size - nb;
unlink (av, victim, bck, fwd);
unlink_chunk (av, victim);
/* Exhaust */
if (remainder_size < MINSIZE)
@ -4022,7 +4029,7 @@ _int_malloc (mstate av, size_t bytes)
remainder_size = size - nb;
/* unlink */
unlink (av, victim, bck, fwd);
unlink_chunk (av, victim);
/* Exhaust */
if (remainder_size < MINSIZE)
@ -4294,7 +4301,7 @@ _int_free (mstate av, mchunkptr p, int have_lock)
p = chunk_at_offset(p, -((long) prevsize));
if (__glibc_unlikely (chunksize(p) != prevsize))
malloc_printerr ("corrupted size vs. prev_size while consolidating");
unlink(av, p, bck, fwd);
unlink_chunk (av, p);
}
if (nextchunk != av->top) {
@ -4303,7 +4310,7 @@ _int_free (mstate av, mchunkptr p, int have_lock)
/* consolidate forward */
if (!nextinuse) {
unlink(av, nextchunk, bck, fwd);
unlink_chunk (av, nextchunk);
size += nextsize;
} else
clear_inuse_bit_at_offset(nextchunk, 0);
@ -4416,8 +4423,6 @@ static void malloc_consolidate(mstate av)
INTERNAL_SIZE_T nextsize;
INTERNAL_SIZE_T prevsize;
int nextinuse;
mchunkptr bck;
mchunkptr fwd;
atomic_store_relaxed (&av->have_fastchunks, false);
@ -4457,7 +4462,7 @@ static void malloc_consolidate(mstate av)
p = chunk_at_offset(p, -((long) prevsize));
if (__glibc_unlikely (chunksize(p) != prevsize))
malloc_printerr ("corrupted size vs. prev_size in fastbins");
unlink(av, p, bck, fwd);
unlink_chunk (av, p);
}
if (nextchunk != av->top) {
@ -4465,7 +4470,7 @@ static void malloc_consolidate(mstate av)
if (!nextinuse) {
size += nextsize;
unlink(av, nextchunk, bck, fwd);
unlink_chunk (av, nextchunk);
} else
clear_inuse_bit_at_offset(nextchunk, 0);
@ -4513,9 +4518,6 @@ _int_realloc(mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
mchunkptr remainder; /* extra space at end of newp */
unsigned long remainder_size; /* its size */
mchunkptr bck; /* misc temp for linking */
mchunkptr fwd; /* misc temp for linking */
unsigned long copysize; /* bytes to copy */
unsigned int ncopies; /* INTERNAL_SIZE_T words to copy */
INTERNAL_SIZE_T* s; /* copy source */
@ -4565,7 +4567,7 @@ _int_realloc(mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
(unsigned long) (nb))
{
newp = oldp;
unlink (av, next, bck, fwd);
unlink_chunk (av, next);
}
/* allocate, copy, free */