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.
static void
scan_object_for_specific_ref (char *start, MonoObject *key)
{
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
#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;
{
while (start < end) {
size_t size;
if (!*(void**)start) {
start += sizeof (void*); /* should be ALLOC_ALIGN, really */
continue;
}
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);
int i;
mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data,
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);
major_collector.iterate_objects (TRUE, TRUE, (IterateObjectCallbackFunc)scan_object_for_specific_ref_callback, key);
LOSObject *bigobj;
mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data,
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);
major_collector.iterate_objects (TRUE, TRUE, (IterateObjectCallbackFunc)scan_object_for_xdomain_refs, NULL);
}
mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data,
}
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.*/
/*Ephemerons and dislinks must be processed before LOS since they might end up pointing
to memory returned to the OS.*/
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,
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;
}
if (found_obj)
return found_obj;
}
hwi.data = data;
clear_nursery_fragments (nursery_next);
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);
major_collector.iterate_objects (TRUE, TRUE, walk_references, &hwi);
mono_sgen_los_iterate_objects (walk_references, &hwi);
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_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()! */
void mono_sgen_check_section_scan_starts (GCMemSection *section) MONO_INTERNAL;
/* Keep in sync with mono_sgen_dump_internal_mem_usage() in dump_heap()! */
if (non_pinned) {
GCMemSection *section;
for (section = section_list; section; section = section->block.next)
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);
}
if (pinned)
mono_sgen_internal_scan_objects (&pinned_allocator, callback, data);