~ chicken-core (chicken-5) 2ff95afa0c34b98c6c063e46568f5275f64b4116


commit 2ff95afa0c34b98c6c063e46568f5275f64b4116
Author:     Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Sat Jun 30 12:46:33 2012 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jul 2 10:54:52 2012 +0200

    When resizing the heap ensure it grows enough to accommodate the nursery. This fixes out of memory errors in extreme cases like allocating finalizers on lots of objects in a tight loop
    
    Signed-off-by: felix <felix@call-with-current-continuation.org>

diff --git a/runtime.c b/runtime.c
index b0ccc85a..04d476fa 100644
--- a/runtime.c
+++ b/runtime.c
@@ -139,8 +139,8 @@ extern void _C_do_apply_hack(void *proc, C_word *args, int count) C_noret;
 #endif
 
 #define DEFAULT_SYMBOL_TABLE_SIZE      2999
-#define DEFAULT_HEAP_SIZE              500000
-#define MINIMAL_HEAP_SIZE              500000
+#define DEFAULT_HEAP_SIZE              DEFAULT_STACK_SIZE
+#define MINIMAL_HEAP_SIZE              DEFAULT_STACK_SIZE
 #define DEFAULT_MAXIMAL_HEAP_SIZE      0x7ffffff0
 #define DEFAULT_HEAP_GROWTH            200
 #define DEFAULT_HEAP_SHRINKAGE         50
@@ -3120,6 +3120,9 @@ 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;
+	  
   if(size > C_maximal_heap_size) size = C_maximal_heap_size;
 
   if(size == heap_size) return;
diff --git a/tests/runtests.bat b/tests/runtests.bat
index 93efb4d3..753257ac 100644
--- a/tests/runtests.bat
+++ b/tests/runtests.bat
@@ -400,6 +400,10 @@ echo ======================================== finalizer tests ...
 if errorlevel 1 exit /b 1
 
 echo ======================================== finalizer tests (2) ...
+%compile% finalizer-error-test.scm
+if errorlevel 1 exit /b 1
+a.out -:hg101
+if errorlevel 1 exit /b 1
 %compile% test-finalizers-2.scm
 if errorlevel 1 exit /b 1
 a.out
diff --git a/tests/runtests.sh b/tests/runtests.sh
index a87d750b..093115c5 100755
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -348,7 +348,7 @@ $compile symbolgc-tests.scm
 echo "======================================== finalizer tests ..."
 $interpret -s test-finalizers.scm
 $compile finalizer-error-test.scm
-./a.out
+./a.out -:hg101
 $compile test-finalizers-2.scm
 ./a.out
 
Trap