From c4d2965fb614480d477a4be52f80ec6d0eb20f3a Mon Sep 17 00:00:00 2001 From: akr Date: Sat, 16 Jun 2007 12:39:35 +0000 Subject: [PATCH] * gc.c (gc_sweep): re-introduce heap extension strategy change. [ruby-dev:31005] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12557 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ gc.c | 12 ++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 059e321a2f..aa7eff401b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Jun 16 21:37:43 2007 Tanaka Akira + + * gc.c (gc_sweep): re-introduce heap extension strategy change. + [ruby-dev:31005] + Fri Jun 15 22:59:37 2007 Tanaka Akira * .gdbinit: new file to ease debugging using gdb. @@ -8,6 +13,7 @@ Fri Jun 15 22:33:55 2007 Tanaka Akira (trap_handler): support SYSTEM_DEFAULT. call default_handler internally. (sig_trap): don't call default_handler. + [ruby-dev:30999] Fri Jun 15 22:33:29 2007 Nobuyoshi Nakada @@ -19,6 +25,7 @@ Fri Jun 15 20:50:02 2007 Tanaka Akira * keywords: enclose C code in declaration section by %{ and %} to avoid extra semicolon after #ifdef RIPPER. + pointed by eban. Fri Jun 15 18:56:52 2007 Tanaka Akira diff --git a/gc.c b/gc.c index 0f0bee0bb2..38097ef2da 100644 --- a/gc.c +++ b/gc.c @@ -1109,6 +1109,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) { @@ -1151,7 +1159,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; @@ -1169,7 +1177,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;