From 9b1da29cffe48b78c6604781e2def25ea398d743 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Wed, 1 Dec 2010 13:13:58 +0100 Subject: [PATCH] [sgen] Handle forwarding in mono_gc_scan_for_specific_ref(). This function is used for debugging purposes only. Previously it didn't handle forwarding which meant that it couldn't be used during a collection. --- mono/metadata/sgen-gc.c | 30 ++++++++++++++++++++++-------- mono/metadata/sgen-gc.h | 2 +- mono/metadata/sgen-major-copying.c | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 7bf362934cd..3057429010a 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -1192,22 +1192,36 @@ scan_object_for_xdomain_refs (char *start, mword size, void *data) static void scan_object_for_specific_ref (char *start, MonoObject *key) { + char *forwarded; + + if ((forwarded = SGEN_OBJECT_IS_FORWARDED (start))) + start = forwarded; + #include "sgen-scan-object.h" } void -mono_sgen_scan_area_with_callback (char *start, char *end, IterateObjectCallbackFunc callback, void *data) +mono_sgen_scan_area_with_callback (char *start, char *end, IterateObjectCallbackFunc callback, void *data, gboolean allow_flags) { while (start < end) { size_t size; + char *obj; + if (!*(void**)start) { start += sizeof (void*); /* should be ALLOC_ALIGN, really */ continue; } - size = ALIGN_UP (safe_object_get_size ((MonoObject*) start)); + if (allow_flags) { + if (!(obj = SGEN_OBJECT_IS_FORWARDED (start))) + obj = start; + } else { + obj = start; + } + + size = ALIGN_UP (safe_object_get_size (obj)); - callback (start, size, data); + callback (obj, size, data); start += size; } @@ -1300,7 +1314,7 @@ mono_gc_scan_for_specific_ref (MonoObject *key) int i; mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, - (IterateObjectCallbackFunc)scan_object_for_specific_ref_callback, key); + (IterateObjectCallbackFunc)scan_object_for_specific_ref_callback, key, TRUE); major_collector.iterate_objects (TRUE, TRUE, (IterateObjectCallbackFunc)scan_object_for_specific_ref_callback, key); @@ -1450,7 +1464,7 @@ check_for_xdomain_refs (void) LOSObject *bigobj; mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, - (IterateObjectCallbackFunc)scan_object_for_xdomain_refs, NULL); + (IterateObjectCallbackFunc)scan_object_for_xdomain_refs, NULL, FALSE); major_collector.iterate_objects (TRUE, TRUE, (IterateObjectCallbackFunc)scan_object_for_xdomain_refs, NULL); @@ -1528,7 +1542,7 @@ mono_gc_clear_domain (MonoDomain * domain) } mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, - (IterateObjectCallbackFunc)clear_domain_process_minor_object_callback, domain); + (IterateObjectCallbackFunc)clear_domain_process_minor_object_callback, domain, FALSE); /*Ephemerons and dislinks must be processed before LOS since they might end up pointing to memory returned to the OS.*/ @@ -5986,7 +6000,7 @@ find_object_for_ptr (char *ptr) if (ptr >= nursery_section->data && ptr < nursery_section->end_data) { found_obj = NULL; mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, - find_object_for_ptr_callback, ptr); + find_object_for_ptr_callback, ptr, TRUE); if (found_obj) return found_obj; } @@ -6565,7 +6579,7 @@ mono_gc_walk_heap (int flags, MonoGCReferences callback, void *data) hwi.data = data; clear_nursery_fragments (nursery_next); - mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, walk_references, &hwi); + mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, walk_references, &hwi, FALSE); major_collector.iterate_objects (TRUE, TRUE, walk_references, &hwi); mono_sgen_los_iterate_objects (walk_references, &hwi); diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index f9f474d6f27..c76cfd569e2 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -577,7 +577,7 @@ void mono_sgen_update_heap_boundaries (mword low, mword high) MONO_INTERNAL; void mono_sgen_register_major_sections_alloced (int num_sections) MONO_INTERNAL; mword mono_sgen_get_minor_collection_allowance (void) MONO_INTERNAL; -void mono_sgen_scan_area_with_callback (char *start, char *end, IterateObjectCallbackFunc callback, void *data) MONO_INTERNAL; +void mono_sgen_scan_area_with_callback (char *start, char *end, IterateObjectCallbackFunc callback, void *data, gboolean allow_flags) MONO_INTERNAL; void mono_sgen_check_section_scan_starts (GCMemSection *section) MONO_INTERNAL; /* Keep in sync with mono_sgen_dump_internal_mem_usage() in dump_heap()! */ diff --git a/mono/metadata/sgen-major-copying.c b/mono/metadata/sgen-major-copying.c index c68b20bd85f..ab8060ec239 100644 --- a/mono/metadata/sgen-major-copying.c +++ b/mono/metadata/sgen-major-copying.c @@ -445,7 +445,7 @@ major_iterate_objects (gboolean non_pinned, gboolean pinned, IterateObjectCallba if (non_pinned) { GCMemSection *section; for (section = section_list; section; section = section->block.next) - mono_sgen_scan_area_with_callback (section->data, section->end_data, callback, data); + mono_sgen_scan_area_with_callback (section->data, section->end_data, callback, data, FALSE); } if (pinned) mono_sgen_internal_scan_objects (&pinned_allocator, callback, data); -- 2.25.1