From: Mark Probst Date: Fri, 11 Jan 2013 00:49:42 +0000 (+0100) Subject: [sgen] Bugfix: When scanning mod table, follow major->major references. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=40459e7bce7ea3e59821ec85e287900cd4dbf8bf;p=mono.git [sgen] Bugfix: When scanning mod table, follow major->major references. --- diff --git a/mono/metadata/sgen-cardtable.c b/mono/metadata/sgen-cardtable.c index 28195c8cdd0..2f1cc604800 100644 --- a/mono/metadata/sgen-cardtable.c +++ b/mono/metadata/sgen-cardtable.c @@ -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; diff --git a/mono/metadata/sgen-cardtable.h b/mono/metadata/sgen-cardtable.h index b5d0c01b869..df47605f652 100644 --- a/mono/metadata/sgen-cardtable.h +++ b/mono/metadata/sgen-cardtable.h @@ -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; diff --git a/mono/metadata/sgen-los.c b/mono/metadata/sgen-los.c index 154800ae5bf..4b7c909037b 100644 --- a/mono/metadata/sgen-los.c +++ b/mono/metadata/sgen-los.c @@ -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); } } diff --git a/mono/metadata/sgen-marksweep.c b/mono/metadata/sgen-marksweep.c index f8019a9f98b..92c2e31081b 100644 --- a/mono/metadata/sgen-marksweep.c +++ b/mono/metadata/sgen-marksweep.c @@ -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;