Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Molaro <lupus@oddwiz.org>2005-02-17 00:23:39 +0300
committerPaolo Molaro <lupus@oddwiz.org>2005-02-17 00:23:39 +0300
commit9e4431fee86a768353e4e8b7abbe4e2bde80d0d4 (patch)
treecdfd43a12b212e53b3567eed59542dab2d9896ca /libgc/alloc.c
parent852f078c276404181d0e56e722a0e9c5c3a814aa (diff)
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). svn path=/trunk/mono/; revision=40776
Diffstat (limited to 'libgc/alloc.c')
-rw-r--r--libgc/alloc.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libgc/alloc.c b/libgc/alloc.c
index c1f40635071..99a61f6f287 100644
--- a/libgc/alloc.c
+++ b/libgc/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;