--- library.scm.orig 2006-01-23 16:20:18.000000000 -0600 +++ library.scm 2006-01-23 16:19:23.000000000 -0600 @@ -3487,9 +3487,18 @@ (let ((print print)) (lambda (x y) (when (fx> (##sys#fudge 26) _max_pending_finalizers) - (when (##sys#fudge 13) - (print "[debug] too many finalizers (" (##sys#fudge 26) "), forcing ...") ) - (##sys#force-finalizers) ) + (if (##core#inline "C_resize_pending_finalizers" (fx* 2 _max_pending_finalizers)) + (begin + (set! ##sys#pending-finalizers (##sys#grow-vector ##sys#pending-finalizers + (fx+ (fx* 2 _max_pending_finalizers) 1) + (##core#undefined))) + (when (##sys#fudge 13) + (print "[debug] too many finalizers (" (##sys#fudge 26) + "), resized max finalizers to " _max_pending_finalizers "...") ) ) + (begin + (when (##sys#fudge 13) + (print "[debug] too many finalizers (" (##sys#fudge 26) "), forcing ...") ) + (##sys#force-finalizers) ) ) ) (##sys#set-finalizer! x y) ) ) ) (define ##sys#run-pending-finalizers --- runtime.c.orig 2006-01-23 15:24:03.000000000 -0600 +++ runtime.c 2006-01-23 16:22:43.000000000 -0600 @@ -988,6 +988,19 @@ panic(C_text("nursery is too small - try higher setting using the `-:s' option")); } +C_word C_resize_pending_finalizers(C_word size) { + int sz = C_num_to_int(size); + + FINALIZER_NODE **newmem = + (FINALIZER_NODE **)C_realloc(pending_finalizer_indices, sz * sizeof(FINALIZER_NODE *)); + + if (newmem == NULL) + return C_SCHEME_FALSE; + + pending_finalizer_indices = newmem; + C_max_pending_finalizers = sz; + return C_SCHEME_TRUE; +} /* Parse runtime options from command-line: */ --- chicken.h.orig 2006-01-23 16:20:27.000000000 -0600 +++ chicken.h 2006-01-23 16:20:51.000000000 -0600 @@ -1155,6 +1155,7 @@ C_fctexport void C_zap_strings(C_word str); C_fctexport void C_set_or_change_heap_size(C_word heap, int reintern); C_fctexport void C_do_resize_stack(C_word stack); +C_fctexport C_word C_resize_pending_finalizers(C_word size); C_fctexport void C_initialize_lf(C_word *lf, int count); C_fctexport void *C_register_lf(C_word *lf, int count); C_fctexport void *C_register_lf2(C_word *lf, int count, C_PTABLE_ENTRY *ptable);