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:
authorRodrigo Kumpera <kumpera@gmail.com>2012-11-29 21:47:40 +0400
committerRodrigo Kumpera <kumpera@gmail.com>2012-11-29 23:06:48 +0400
commit6d607ca572994f8bad63888dd36b4915cdfef6eb (patch)
tree37bef393ab2718a351e30982b2b8042c4991fe08
parent74b96c4c81daa1fbb9202c5becb91bfc9c2b5a99 (diff)
Add stats for cards remarked by the gc and left untouched by the mutator after.
* sgen-cardtable.c: A nursery object might not be promoted if it's pinned or, unlikely, the major heap is full. Under those circumstances we need to remark the card and leave the object behind. With this we can see how many extra cards are kept due to pinning.
-rw-r--r--mono/metadata/sgen-cardtable.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/mono/metadata/sgen-cardtable.c b/mono/metadata/sgen-cardtable.c
index 4fad8b6678a..3976a0d833e 100644
--- a/mono/metadata/sgen-cardtable.c
+++ b/mono/metadata/sgen-cardtable.c
@@ -599,7 +599,7 @@ LOOP_HEAD:
#ifdef CARDTABLE_STATS
typedef struct {
- int total, marked, remarked;
+ int total, marked, remarked, gc_marked;
} card_stats;
static card_stats major_stats, los_stats;
@@ -610,9 +610,12 @@ count_marked_cards (mword start, mword size)
{
mword end = start + size;
while (start <= end) {
+ guint8 card = *sgen_card_table_get_card_address (start);
++cur_stats->total;
- if (sgen_card_table_address_is_marked (start))
+ if (card)
++cur_stats->marked;
+ if (card == 2)
+ ++cur_stats->gc_marked;
start += CARD_SIZE_IN_BYTES;
}
}
@@ -622,8 +625,10 @@ count_remarked_cards (mword start, mword size)
{
mword end = start + size;
while (start <= end) {
- if (sgen_card_table_address_is_marked (start))
+ if (sgen_card_table_address_is_marked (start)) {
++cur_stats->remarked;
+ *sgen_card_table_get_card_address (start) = 2;
+ }
start += CARD_SIZE_IN_BYTES;
}
}
@@ -643,12 +648,12 @@ sgen_card_tables_collect_stats (gboolean begin)
sgen_los_iterate_live_block_ranges (count_marked_cards);
} else {
cur_stats = &major_stats;
- sgen_major_collector_iterate_live_block_ranges (count_marked_cards);
+ sgen_major_collector_iterate_live_block_ranges (count_remarked_cards);
cur_stats = &los_stats;
sgen_los_iterate_live_block_ranges (count_remarked_cards);
- printf ("cards major (t %d m %d r %d) los (t %d m %d r %d) major_scan %.2fms los_scan %.2fms\n",
- major_stats.total, major_stats.marked, major_stats.remarked,
- los_stats.total, los_stats.marked, los_stats.remarked,
+ printf ("cards major (t %d m %d g %d r %d) los (t %d m %d g %d r %d) major_scan %.2fms los_scan %.2fms\n",
+ major_stats.total, major_stats.marked, major_stats.gc_marked, major_stats.remarked,
+ los_stats.total, los_stats.marked, los_stats.gc_marked, los_stats.remarked,
last_major_scan_time / 1000.0, last_los_scan_time / 1000.0);
}
#endif