[sgen] Fix whole heap check for cementing.
authorMark Probst <mark.probst@gmail.com>
Tue, 1 Jan 2013 20:18:58 +0000 (21:18 +0100)
committerMark Probst <mark.probst@gmail.com>
Wed, 23 Jan 2013 12:04:23 +0000 (13:04 +0100)
mono/metadata/sgen-debug.c
mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h

index 68a769a824770ff806508028e92439cf7bcff3f3..e20576a12d355fa10edd730d7d4933fed8cb4173 100644 (file)
@@ -32,6 +32,7 @@
 #include "metadata/sgen-ssb.h"
 #include "metadata/sgen-protocol.h"
 #include "metadata/sgen-memory-governor.h"
+#include "metadata/sgen-pinning.h"
 
 #define LOAD_VTABLE    SGEN_LOAD_VTABLE
 
@@ -358,15 +359,17 @@ FIXME Flag missing remsets due to pinning as non fatal
                        if (!is_valid_object_pointer (*(char**)ptr)) {  \
                                bad_pointer_spew ((char*)obj, (char**)ptr);     \
                        } else if (!sgen_ptr_in_nursery (obj) && sgen_ptr_in_nursery ((char*)*ptr)) {   \
-                               if (!sgen_get_remset ()->find_address ((char*)(ptr))) \
+                               if (!sgen_get_remset ()->find_address ((char*)(ptr)) && !sgen_cement_lookup_or_register ((char*)*(ptr), FALSE) && (!allow_missing_pinned || !SGEN_OBJECT_IS_PINNED ((char*)*(ptr)))) \
                                missing_remset_spew ((char*)obj, (char**)ptr);  \
                        }       \
         } \
        } while (0)
 
 static void
-verify_object_pointers_callback (char *start, size_t size, void *dummy)
+verify_object_pointers_callback (char *start, size_t size, void *data)
 {
+       gboolean allow_missing_pinned = (gboolean)data;
+
 #define SCAN_OBJECT_ACTION
 #include "sgen-scan-object.h"
 }
@@ -377,14 +380,14 @@ FIXME:
 depend on OP_DUMMY_USE.
 */
 void
-sgen_check_whole_heap (void)
+sgen_check_whole_heap (gboolean allow_missing_pinned)
 {
        setup_valid_nursery_objects ();
 
        broken_heap = FALSE;
-       sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, verify_object_pointers_callback, NULL, FALSE);
-       major_collector.iterate_objects (TRUE, TRUE, verify_object_pointers_callback, NULL);
-       sgen_los_iterate_objects (verify_object_pointers_callback, NULL);       
+       sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, verify_object_pointers_callback, (void*)allow_missing_pinned, FALSE);
+       major_collector.iterate_objects (TRUE, TRUE, verify_object_pointers_callback, (void*)allow_missing_pinned);
+       sgen_los_iterate_objects (verify_object_pointers_callback, (void*)allow_missing_pinned);
 
        g_assert (!broken_heap);
 }
index f32315e6f04ac4217a1298d7924f1bbd8f2bb387..2072fa96a99b491d3c2e88e2ac7e8f5123e39125 100644 (file)
@@ -2637,7 +2637,7 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark)
 
        if (whole_heap_check_before_collection) {
                sgen_clear_nursery_fragments ();
-               sgen_check_whole_heap ();
+               sgen_check_whole_heap (finish_up_concurrent_mark);
        }
        if (consistency_check_at_minor_collection)
                sgen_check_consistency ();
@@ -2866,7 +2866,7 @@ major_copy_or_mark_from_roots (int *old_next_pin_slot, gboolean finish_up_concur
        sgen_clear_nursery_fragments ();
 
        if (whole_heap_check_before_collection)
-               sgen_check_whole_heap ();
+               sgen_check_whole_heap (finish_up_concurrent_mark);
 
        TV_GETTIME (btv);
        time_major_pre_collection_fragment_clear += TV_ELAPSED (atv, btv);
@@ -3365,6 +3365,9 @@ major_update_or_finish_concurrent_collection (gboolean force_finish)
        current_collection_generation = GENERATION_OLD;
        major_finish_collection ("finishing", -1, TRUE);
 
+       if (whole_heap_check_before_collection)
+               sgen_check_whole_heap (FALSE);
+
        unpin_objects_from_queue (&unpin_queue);
        sgen_gray_object_queue_deinit (&unpin_queue);
 
@@ -3372,9 +3375,6 @@ major_update_or_finish_concurrent_collection (gboolean force_finish)
 
        current_collection_generation = -1;
 
-       if (whole_heap_check_before_collection)
-               sgen_check_whole_heap ();
-
        return TRUE;
 }
 
@@ -5704,7 +5704,7 @@ sgen_check_whole_heap_stw (void)
 {
        sgen_stop_world (0);
        sgen_clear_nursery_fragments ();
-       sgen_check_whole_heap ();
+       sgen_check_whole_heap (FALSE);
        sgen_restart_world (0, NULL);
 }
 
index 3d29072180d0d337ba98ebbd48c856313ff0bc85..1b34cffccdda5e65af79adfd104500312c8c97ee 100644 (file)
@@ -1043,7 +1043,7 @@ gboolean sgen_has_managed_allocator (void);
 
 void sgen_check_consistency (void);
 void sgen_check_major_refs (void);
-void sgen_check_whole_heap (void);
+void sgen_check_whole_heap (gboolean allow_missing_pinning);
 void sgen_check_whole_heap_stw (void) MONO_INTERNAL;
 void sgen_check_objref (char *obj);
 void sgen_check_major_heap_marked (void) MONO_INTERNAL;