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. --- ChangeLog | 5 +++++ Src/mem.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index ef5cbe1f0..31fc78366 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-10-24 Barton E. Schaefer + + * 36943 (with updated comment): Src/mem.c: restore scan for + reclaimable blocks in freeheap() [had been removed by 36834] + 2015-10-24 Peter Stephenson * unposted: Src/utils.c: small typo. 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