#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
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"
}
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);
}
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 ();
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);
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);
current_collection_generation = -1;
- if (whole_heap_check_before_collection)
- sgen_check_whole_heap ();
-
return TRUE;
}
{
sgen_stop_world (0);
sgen_clear_nursery_fragments ();
- sgen_check_whole_heap ();
+ sgen_check_whole_heap (FALSE);
sgen_restart_world (0, NULL);
}
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;