/* FIXME: -This heap checker is racy regarding inlined write barriers and other JIT tricks that depend on OP_DUMMY_USE. */ void sgen_check_whole_heap (void) { /*setup valid_nursery_objects*/ if (!valid_nursery_objects) valid_nursery_objects = sgen_alloc_os_memory (DEFAULT_NURSERY_SIZE, SGEN_ALLOC_INTERNAL | SGEN_ALLOC_ACTIVATE, "debugging data"); valid_nursery_object_count = 0; sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, setup_mono_sgen_scan_area_with_callback, NULL, FALSE); 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); g_assert (!broken_heap); }
static void major_iterate_objects (gboolean non_pinned, gboolean pinned, IterateObjectCallbackFunc callback, void *data) { if (non_pinned) { GCMemSection *section; for (section = section_list; section; section = section->block.next) sgen_scan_area_with_callback (section->data, section->end_data, callback, data, FALSE); } if (pinned) sgen_pinned_scan_objects (&pinned_allocator, callback, data); }