summary refs log tree commit diff
path: root/Src/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/mem.c')
-rw-r--r--Src/mem.c10
1 files changed, 8 insertions, 2 deletions
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