summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/mem.c10
2 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 44830070e..e6edaa8c0 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 Daniel Shahaf <d.s@daniel.shahaf.name>
* unposted: Completion/Unix/Command/_beep: _beep completion:
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