diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | 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 <schaefer@zsh.org> + + * 36943 (with updated comment): Src/mem.c: restore scan for + reclaimable blocks in freeheap() [had been removed by 36834] + 2015-10-24 Peter Stephenson <p.w.stephenson@ntlworld.com> * 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 |