Avoid a superfluous copy.
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 16 Sep 2010 20:44:13 +0000 (17:44 -0300)
committerRodrigo Kumpera <kumpera@gmail.com>
Sun, 19 Sep 2010 19:39:09 +0000 (16:39 -0300)
        * sgen-marksweep.c (major_scan_card_table): Avoid an extra
        copy under overlapping card.

mono/metadata/sgen-cardtable.c
mono/metadata/sgen-marksweep.c

index dc8195d6af293af51f2db5e1c09269d8c4555506..ba0d151641555eddf715cdc301b5687a06269aa8 100644 (file)
@@ -230,6 +230,7 @@ scan_from_card_tables (void *start_nursery, void *end_nursery, GrayQueue *queue)
 {
        if (use_cardtable) {
 #ifdef SGEN_HAVE_OVERLAPPING_CARDS
+       /*FIXME we should have a bit on each block/los object telling if the object have marked cards.*/
        /*First we copy*/
        major_collector.iterate_live_block_ranges (move_cards_to_shadow_table);
        los_iterate_live_block_ranges (move_cards_to_shadow_table);
index b19d49439d3a7b28b7b3cdfe15f035b8891c0325..3fa2f5ad2475319663672df37c6608a7d7d9075c 100644 (file)
@@ -1313,11 +1313,20 @@ major_scan_card_table (SgenGrayQueue *queue)
                block_start = block->block;
 
                if (block_obj_size >= CARD_SIZE_IN_BYTES) {
-                       guint8 cards [CARDS_PER_BLOCK];
+                       guint8 *cards;
+#ifndef SGEN_HAVE_OVERLAPPING_CARDS
+                       guint8 cards_data [CARDS_PER_BLOCK];
+#endif
                        char *obj, *end, *base;
 
-                       if (!sgen_card_table_get_card_data (cards, (mword)block_start, CARDS_PER_BLOCK))
+                       /*We can avoid the extra copy since the remark cardtable was cleaned before */
+#ifdef SGEN_HAVE_OVERLAPPING_CARDS
+                       cards = sgen_card_table_get_card_scan_address ((mword)block_start);
+#else
+                       cards = cards_data;
+                       if (!sgen_card_table_get_card_data (cards_data, (mword)block_start, CARDS_PER_BLOCK))
                                continue;
+#endif
 
                        obj = (char*)MS_BLOCK_OBJ_FAST (block_start, block_obj_size, 0);
                        end = block_start + MS_BLOCK_SIZE;