X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-debug.c;h=904460bdfdd94e80a2e74651bdef627e484f20d7;hb=b319e134efc9d4d52593969f6354de825e85aca0;hp=cb2fbb7f7c68b8eaab143ff3701dc912bc5f509b;hpb=3470747e2965ab1b61a1f735cbcd22714b82dd24;p=mono.git diff --git a/mono/sgen/sgen-debug.c b/mono/sgen/sgen-debug.c index cb2fbb7f7c6..904460bdfdd 100644 --- a/mono/sgen/sgen-debug.c +++ b/mono/sgen/sgen-debug.c @@ -1,5 +1,6 @@ -/* - * sgen-debug.c: Collector debugging +/** + * \file + * Collector debugging * * Author: * Paolo Molaro (lupus@ximian.com) @@ -324,7 +325,7 @@ static void setup_valid_nursery_objects (void) { if (!valid_nursery_objects) - valid_nursery_objects = (GCObject **)sgen_alloc_os_memory (DEFAULT_NURSERY_SIZE, (SgenAllocFlags)(SGEN_ALLOC_INTERNAL | SGEN_ALLOC_ACTIVATE), "debugging data"); + valid_nursery_objects = (GCObject **)sgen_alloc_os_memory (sgen_nursery_max_size, (SgenAllocFlags)(SGEN_ALLOC_INTERNAL | SGEN_ALLOC_ACTIVATE), "debugging data", MONO_MEM_ACCOUNT_SGEN_DEBUGGING); 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, FALSE); } @@ -501,9 +502,9 @@ find_pinning_ref_from_thread (char *obj, size_t size) char **start = (char**)info->client_info.stack_start; if (info->client_info.skip || info->client_info.gc_disabled) continue; - while (start < (char**)info->client_info.stack_end) { + while (start < (char**)info->client_info.info.stack_end) { if (*start >= obj && *start < endobj) - SGEN_LOG (0, "Object %p referenced in thread %p (id %p) at %p, stack: %p-%p", obj, info, (gpointer)mono_thread_info_get_tid (info), start, info->client_info.stack_start, info->client_info.stack_end); + SGEN_LOG (0, "Object %p referenced in thread %p (id %p) at %p, stack: %p-%p", obj, info, (gpointer)mono_thread_info_get_tid (info), start, info->client_info.stack_start, info->client_info.info.stack_end); start++; } @@ -804,6 +805,15 @@ scan_roots_for_specific_ref (GCObject *key, int root_type) } break; } + case ROOT_DESC_VECTOR: { + void **p; + + for (p = start_root; p < (void**)root->end_root; p++) { + if (*p) + check_root_obj_specific_ref (root, key, (GCObject *)*p); + } + break; + } case ROOT_DESC_USER: { SgenUserRootMarkFunc marker = sgen_get_user_descriptor_func (desc); marker (start_root, check_root_obj_specific_ref_from_marker, NULL); @@ -908,6 +918,15 @@ sgen_scan_for_registered_roots_in_domain (MonoDomain *domain, int root_type) } break; } + case ROOT_DESC_VECTOR: { + void **p; + + for (p = start_root; p < (void**)root->end_root; p++) { + if (*p) + check_obj_not_in_domain ((MonoObject **)*p); + } + break; + } case ROOT_DESC_USER: { SgenUserRootMarkFunc marker = sgen_get_user_descriptor_func (desc); marker (start_root, check_obj_not_in_domain_callback, NULL); @@ -940,12 +959,6 @@ is_xdomain_ref_allowed (GCObject **ptr, GCObject *obj, MonoDomain *domain) offset == G_STRUCT_OFFSET (MonoRealProxy, unwrapped_server)) return TRUE; #endif - /* Thread.cached_culture_info */ - if (!strcmp (ref->vtable->klass->name_space, "System.Globalization") && - !strcmp (ref->vtable->klass->name, "CultureInfo") && - !strcmp(o->vtable->klass->name_space, "System") && - !strcmp(o->vtable->klass->name, "Object[]")) - return TRUE; /* * at System.IO.MemoryStream.InternalConstructor (byte[],int,int,bool,bool) [0x0004d] in /home/schani/Work/novell/trunk/mcs/class/corlib/System.IO/MemoryStream.cs:121 * at System.IO.MemoryStream..ctor (byte[]) [0x00017] in /home/schani/Work/novell/trunk/mcs/class/corlib/System.IO/MemoryStream.cs:81 @@ -983,7 +996,8 @@ check_reference_for_xdomain (GCObject **ptr, GCObject *obj, MonoDomain *domain) for (klass = obj->vtable->klass; klass; klass = klass->parent) { int i; - for (i = 0; i < klass->field.count; ++i) { + int fcount = mono_class_get_field_count (klass); + for (i = 0; i < fcount; ++i) { if (klass->fields[i].offset == offset) { field = &klass->fields[i]; break; @@ -1051,10 +1065,10 @@ void sgen_dump_section (GCMemSection *section, const char *type) { char *start = section->data; - char *end = section->data + section->size; + char *end = section->end_data; char *occ_start = NULL; - fprintf (heap_dump_file, "
\n", type, (unsigned long)section->size); + fprintf (heap_dump_file, "
\n", type, (unsigned long)(section->end_data - section->data)); while (start < end) { guint size; @@ -1069,7 +1083,6 @@ sgen_dump_section (GCMemSection *section, const char *type) start += sizeof (void*); /* should be ALLOC_ALIGN, really */ continue; } - g_assert (start < section->next_data); if (!occ_start) occ_start = start;