From b0d690331db157f53ac4a8bd9d4bb7513a561d90 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 24 Jan 2018 18:25:39 -0800 Subject: [PATCH] * 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 --- mmap.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/mmap.c b/mmap.c index 41bbc71..32fcba6 100644 --- a/mmap.c +++ b/mmap.c @@ -69,11 +69,33 @@ struct backtrace_freelist_struct static void 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)) { + size_t c; + struct backtrace_freelist_struct **ppsmall; + struct backtrace_freelist_struct **pp; 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->next = state->freelist; p->size = size;