[sgen] Handle forwarding in mono_gc_scan_for_specific_ref().
authorMark Probst <mark.probst@gmail.com>
Wed, 1 Dec 2010 12:13:58 +0000 (13:13 +0100)
committerMark Probst <mark.probst@gmail.com>
Thu, 2 Dec 2010 13:07:53 +0000 (14:07 +0100)
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
mono/metadata/sgen-gc.h
mono/metadata/sgen-major-copying.c

index 7bf362934cd64269e55b8fa7ae52f5d2270fdb7e..3057429010aeb51fedcf45ebd0552ed4a2e8067f 100644 (file)
@@ -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);
index f9f474d6f275bae0adf050a8fe37136cd33d9f25..c76cfd569e2b9a5173b8b84efbcfaa73b0f08d14 100644 (file)
@@ -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()! */
index c68b20bd85f2efb34853bcbd5944da374f330461..ab8060ec239e315cc89be37d0a545fc8b659ee90 100644 (file)
@@ -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);