~ chicken-core (chicken-5) c6384b71dd9ade032449c67231be83bc4f486c25
commit c6384b71dd9ade032449c67231be83bc4f486c25
Author: Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Mon Oct 14 22:14:34 2013 +0200
Commit: Mario Domenech Goulart <mario.goulart@gmail.com>
CommitDate: Thu Oct 17 15:07:54 2013 -0300
Grow both halves of the heap by stack_size instead of growing them by half the stack_size
Signed-off-by: Mario Domenech Goulart <mario.goulart@gmail.com>
diff --git a/runtime.c b/runtime.c
index ab61a0de..f459bd61 100644
--- a/runtime.c
+++ b/runtime.c
@@ -3296,8 +3296,13 @@ C_regparm void C_fcall C_rereclaim2(C_uword size, int double_plus)
if(size < MINIMAL_HEAP_SIZE) size = MINIMAL_HEAP_SIZE;
- /* Heap must at least grow enough to accommodate first generation (nursery) */
- if(size - heap_size < stack_size) size = heap_size + stack_size;
+ /*
+ * Heap must at least grow enough to accommodate first generation
+ * (nursery). Because we're calculating the total heap size here
+ * (fromspace *AND* tospace), we have to double the stack size,
+ * otherwise we'd accommodate only half the stack in the tospace.
+ */
+ if(size - heap_size < stack_size * 2) size = heap_size + stack_size * 2;
if(size > C_maximal_heap_size) size = C_maximal_heap_size;
@@ -3314,9 +3319,17 @@ C_regparm void C_fcall C_rereclaim2(C_uword size, int double_plus)
(C_word)tospace_start, (C_word)tospace_limit);
}
- heap_size = size;
- size /= 2;
-
+ heap_size = size; /* Total heap size of the two halves... */
+ size /= 2; /* ...each half is this big */
+
+ /*
+ * Start by allocating the new heap's fromspace. After remarking,
+ * allocate the other half of the new heap (its tospace).
+ *
+ * To clarify: what we call "new_space" here is what will eventually
+ * be cycled over to "fromspace" when re-reclamation has finished
+ * (that is, after the old one has been freed).
+ */
if ((new_heapspace = heap_alloc (size, &new_tospace_start)) == NULL)
panic(C_text("out of memory - cannot allocate heap segment"));
new_heapspace_size = size;
Trap