From 6d67a688f2a4115654811945257177b75b29f94f Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 10 Jul 2006 10:26:45 +0000 Subject: * gc.c (gc_sweep): expand heap earlier. reported by MORITA Naoyuki. [ruby-dev:28960] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10507 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ gc.c | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4aea73aa70..c53ce41026 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Jul 10 19:22:19 2006 Tanaka Akira + + * gc.c (gc_sweep): expand heap earlier. + reported by MORITA Naoyuki. [ruby-dev:28960] + Mon Jul 10 18:59:34 2006 Hidetoshi NAGAI * ext/tk/lib/tk/font.rb: sorry. mistaken to patch. diff --git a/gc.c b/gc.c index a3aaca1057..9569aec05f 100644 --- a/gc.c +++ b/gc.c @@ -1057,6 +1057,14 @@ gc_sweep(void) int freed = 0; int i; unsigned long live = 0; + unsigned long free_min = 0; + + for (i = 0; i < heaps_used; i++) { + free_min += heaps[i].limit; + } + free_min = free_min * 0.2; + if (free_min < FREE_MIN) + free_min = FREE_MIN; mark_source_filename(ruby_sourcefile); if (source_filenames) { @@ -1099,7 +1107,7 @@ gc_sweep(void) } p++; } - if (n == heaps[i].limit && freed > FREE_MIN) { + if (n == heaps[i].limit && freed > free_min) { RVALUE *pp; heaps[i].limit = 0; @@ -1117,7 +1125,7 @@ gc_sweep(void) if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT; } malloc_increase = 0; - if (freed < FREE_MIN) { + if (freed < free_min) { add_heap(); } during_gc = 0; -- cgit v1.2.3