summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/mem.c12
2 files changed, 12 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 3adb1f159..421da2f6f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,9 @@
 2015-10-11  Barton E. Schaefer  <schaefer@zsh.org>
 
-	* 36834: Src/mem.c: freeheap preserves last allocated heap
+	* 36836: Src/mem.c: zhalloc() avoids re-scanning all heaps when
+	the last known heap with free space does not have enough space
+
+	* 36834: Src/mem.c: freeheap() preserves last allocated heap
 
 2015-10-11  Frank Terbeck  <ft@bewatermyfriend.org>
 
diff --git a/Src/mem.c b/Src/mem.c
index d49f685fe..191428323 100644
--- a/Src/mem.c
+++ b/Src/mem.c
@@ -582,10 +582,14 @@ zhalloc(size_t size)
 
     /* find a heap with enough free space */
 
-    for (h = ((fheap && ARENA_SIZEOF(fheap) >= (size + fheap->used))
-	      ? fheap : heaps);
-	 h; h = h->next) {
-	hp = h;
+    /*
+     * This previously assigned:
+     *   h = ((fheap && ARENA_SIZEOF(fheap) >= (size + fheap->used))
+     *	      ? fheap : heaps);
+     * but we think that nothing upstream of fheap has more free space,
+     * so why start over at heaps just because fheap has too little?
+     */
+    for (h = (fheap ? fheap : heaps); h; h = h->next) {
 	if (ARENA_SIZEOF(h) >= (n = size + h->used)) {
 	    void *ret;