* mmap.c (backtrace_free_locked): Don't put more than 16 entries

on the free list.

Fixes #5
Fixes rust-lang/rust#29293
Fixes rust-lang/rust#37477
This commit is contained in:
Ian Lance Taylor 2018-01-24 18:25:39 -08:00
parent 3739537b9c
commit b0d690331d
1 changed files with 23 additions and 1 deletions

24
mmap.c
View File

@ -69,11 +69,33 @@ struct backtrace_freelist_struct
static void static void
backtrace_free_locked (struct backtrace_state *state, void *addr, size_t size) backtrace_free_locked (struct backtrace_state *state, void *addr, size_t size)
{ {
/* Just leak small blocks. We don't have to be perfect. */ /* Just leak small blocks. We don't have to be perfect. Don't put
more than 16 entries on the free list, to avoid wasting time
searching when allocating a block. If we have more than 16
entries, leak the smallest entry. */
if (size >= sizeof (struct backtrace_freelist_struct)) if (size >= sizeof (struct backtrace_freelist_struct))
{ {
size_t c;
struct backtrace_freelist_struct **ppsmall;
struct backtrace_freelist_struct **pp;
struct backtrace_freelist_struct *p; struct backtrace_freelist_struct *p;
c = 0;
ppsmall = NULL;
for (pp = &state->freelist; *pp != NULL; pp = &(*pp)->next)
{
if (ppsmall == NULL || (*pp)->size < (*ppsmall)->size)
ppsmall = pp;
++c;
}
if (c >= 16)
{
if (size <= (*ppsmall)->size)
return;
*ppsmall = (*ppsmall)->next;
}
p = (struct backtrace_freelist_struct *) addr; p = (struct backtrace_freelist_struct *) addr;
p->next = state->freelist; p->next = state->freelist;
p->size = size; p->size = size;