summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-10 10:26:45 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-10 10:26:45 +0000
commitfb5ff37bae7279553461de9867d9e6abbaa52d66 (patch)
tree03b2ebca9b7a519c724aa9ecc8e6882db8d09332
parent6a33016778bef5984e2faf64077cdd177335985d (diff)
* gc.c (gc_sweep): expand heap earlier.
reported by MORITA Naoyuki. [ruby-dev:28960] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@10507 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--gc.c12
2 files changed, 15 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 8993248b25..220e75b0de 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Jul 10 19:22:19 2006 Tanaka Akira <akr@fsij.org>
+
+ * gc.c (gc_sweep): expand heap earlier.
+ reported by MORITA Naoyuki. [ruby-dev:28960]
+
Mon Jul 10 18:59:34 2006 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tk/lib/tk/font.rb: sorry. mistaken to patch.
diff --git a/gc.c b/gc.c
index 8a98df8514..c73da2c278 100644
--- a/gc.c
+++ b/gc.c
@@ -1056,6 +1056,14 @@ gc_sweep()
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;
if (ruby_in_compile && ruby_parser_stack_on_heap()) {
/* should not reclaim nodes during compilation
@@ -1111,7 +1119,7 @@ gc_sweep()
}
p++;
}
- if (n == heaps[i].limit && freed > FREE_MIN) {
+ if (n == heaps[i].limit && freed > free_min) {
RVALUE *pp;
heaps[i].limit = 0;
@@ -1129,7 +1137,7 @@ gc_sweep()
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;