[sgen] Bugfix: When scanning mod table, follow major->major references.
authorMark Probst <mark.probst@gmail.com>
Fri, 11 Jan 2013 00:49:42 +0000 (01:49 +0100)
committerMark Probst <mark.probst@gmail.com>
Fri, 11 Jan 2013 12:32:44 +0000 (13:32 +0100)
mono/metadata/sgen-cardtable.c
mono/metadata/sgen-cardtable.h
mono/metadata/sgen-los.c
mono/metadata/sgen-marksweep.c

index 28195c8cdd007f41725bb46d05b3e1e07a1ad00e..2f1cc604800a845eca3e33e7903bbff60373f7cf 100644 (file)
@@ -485,7 +485,8 @@ find_next_card (guint8 *card_data, guint8 *end)
 }
 
 void
-sgen_cardtable_scan_object (char *obj, mword block_obj_size, guint8 *cards, SgenGrayQueue *queue)
+sgen_cardtable_scan_object (char *obj, mword block_obj_size, guint8 *cards,
+               gboolean always_copy_or_mark, SgenGrayQueue *queue)
 {
        MonoVTable *vt = (MonoVTable*)SGEN_LOAD_VTABLE (obj);
        MonoClass *klass = vt->klass;
@@ -564,7 +565,7 @@ LOOP_HEAD:
                                HEAVY_STAT (++los_array_cards);
                                for (; elem < card_end; elem += SIZEOF_VOID_P) {
                                        gpointer new, old = *(gpointer*)elem;
-                                       if (G_UNLIKELY (sgen_ptr_in_nursery (old))) {
+                                       if ((always_copy_or_mark && old) || G_UNLIKELY (sgen_ptr_in_nursery (old))) {
                                                HEAVY_STAT (++los_array_remsets);
                                                copy_func ((void**)elem, queue);
                                                new = *(gpointer*)elem;
index b5d0c01b8696c2cd9f9cf706a580a9055fc164a6..df47605f6525ca79a4382a21981267eaccd22ade 100644 (file)
@@ -31,7 +31,8 @@
 void sgen_card_table_reset_region (mword start, mword end) MONO_INTERNAL;
 void* sgen_card_table_align_pointer (void *ptr) MONO_INTERNAL;
 void sgen_card_table_mark_range (mword address, mword size) MONO_INTERNAL;
-void sgen_cardtable_scan_object (char *obj, mword obj_size, guint8 *cards, SgenGrayQueue *queue) MONO_INTERNAL;
+void sgen_cardtable_scan_object (char *obj, mword obj_size, guint8 *cards,
+               gboolean always_copy_or_mark, SgenGrayQueue *queue) MONO_INTERNAL;
 
 gboolean sgen_card_table_get_card_data (guint8 *dest, mword address, mword cards) MONO_INTERNAL;
 
index 154800ae5bf22b2c9435086789ae652ec4cb2bd3..4b7c909037b01d1f6568525eb0c03e1a35212ee6 100644 (file)
@@ -548,7 +548,7 @@ sgen_los_scan_card_table (gboolean mod_union, SgenGrayQueue *queue)
                        g_assert (cards);
                }
 
-               sgen_cardtable_scan_object (obj->data, obj->size, cards, queue);
+               sgen_cardtable_scan_object (obj->data, obj->size, cards, mod_union, queue);
        }
 }
 
index f8019a9f98bbb249724fce9cbdaa6a2a7d23de63..92c2e31081b05bb15dfdc2245b62d4a0c2b32d9f 100644 (file)
@@ -2060,7 +2060,7 @@ major_scan_card_table (gboolean mod_union, SgenGrayQueue *queue)
                                }
 
                                card_offset = (obj - base) >> CARD_BITS;
-                               sgen_cardtable_scan_object (obj, block_obj_size, cards + card_offset, queue);
+                               sgen_cardtable_scan_object (obj, block_obj_size, cards + card_offset, mod_union, queue);
 
                        next_large:
                                obj += block_obj_size;