* 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:
parent
3739537b9c
commit
b0d690331d
24
mmap.c
24
mmap.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue