summaryrefslogtreecommitdiff
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;