From 506d5923802a930f24dd264588a8d33c05ed085b Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Sat, 24 Oct 2015 13:43:21 -0700 Subject: 36943: restore scan for reclaimable blocks in freeheap() That scan had been removed by 36834, but testing showed memory usage climbing too high in cases where a new arena was always added at the end of the heap list. --- Src/mem.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'Src/mem.c') diff --git a/Src/mem.c b/Src/mem.c index 68bd76740..158ad9641 100644 --- a/Src/mem.c +++ b/Src/mem.c @@ -340,9 +340,15 @@ freeheap(void) * and performance goes to hell. * * Therefore, we defer freeing the most recently allocated arena until - * we reach popheap(). This may fail to reclaim some space in earlier - * arenas. + * we reach popheap(). * + * However, if the arena to which fheap points is unused, we want to + * reclaim space in earlier arenas, so we have no choice but to do the + * sweep for a new fheap. + */ + if (fheap && !fheap->sp) + fheap = NULL; /* We used to do this unconditionally */ + /* * In other cases, either fheap is already correct, or it has never * been set and this loop will do it, or it'll be reset from scratch * on the next popheap(). So all that's needed here is to pick up -- cgit 1.4.1