]> granicus.if.org Git - gc/commitdiff
Wed Feb 16 22:30:54 CET 2005 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Wed, 16 Feb 2005 21:23:39 +0000 (21:23 +0000)
committerguest <ivmai@mail.ru>
Fri, 29 Jul 2011 11:24:19 +0000 (15:24 +0400)
* alloc.c: tune the code to collect instead of expanding
the heap if there are many finalizers and we reclaimed some
memory from cleaning the finalization queue (should fix
bug #71001 and #70701).

svn path=/trunk/mono/; revision=40776

ChangeLog
alloc.c

index 89a05848bc911723daf8eac571f78634d9be822d..052fff6ae2a986d935059da82dd0b58f09565f45 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+
+Wed Feb 16 22:30:54 CET 2005 Paolo Molaro <lupus@ximian.com>
+
+       * alloc.c: tune the code to collect instead of expanding
+       the heap if there are many finalizers and we reclaimed some
+       memory from cleaning the finalization queue (should fix
+       bug #71001 and #70701).
+
 2005-02-07  Geoff Norton  <gnorton@customerdna.com>
 
        * include/private/gc_priv.h: Bump the max root sets to 1024
diff --git a/alloc.c b/alloc.c
index c1f40635071a15add0dbb31fcf1b506e3aea7c0b..99a61f6f287cfc70e04f608a7d26caa27216afd7 100644 (file)
--- a/alloc.c
+++ b/alloc.c
@@ -1021,13 +1021,20 @@ unsigned GC_fail_count = 0;
                        /* How many consecutive GC/expansion failures?  */
                        /* Reset by GC_allochblk.                       */
 
+static word last_fo_entries = 0;
+static word last_words_finalized = 0;
+
 GC_bool GC_collect_or_expand(needed_blocks, ignore_off_page)
 word needed_blocks;
 GC_bool ignore_off_page;
 {
     if (!GC_incremental && !GC_dont_gc &&
-       (GC_dont_expand && GC_words_allocd > 0 || GC_should_collect())) {
+       (GC_dont_expand && GC_words_allocd > 0 
+       || (GC_fo_entries > (last_fo_entries + 500) && (last_words_finalized  || GC_words_finalized))
+       || GC_should_collect())) {
       GC_gcollect_inner();
+      last_fo_entries = GC_fo_entries;
+      last_words_finalized = GC_words_finalized;
     } else {
       word blocks_to_get = GC_heapsize/(HBLKSIZE*GC_free_space_divisor)
                           + needed_blocks;