2008-12-10 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Wed, 10 Dec 2008 20:10:10 +0000 (20:10 -0000)
committerZoltan Varga <vargaz@gmail.com>
Wed, 10 Dec 2008 20:10:10 +0000 (20:10 -0000)
* sgen-gc.c (build_nursery_fragments): Clear nursery_next/nursery_frag_real_end.

* sgen-gc.c (check_object): New debugging helper function.

* object.c: Fix calls to mono_value_copy_array ().

svn path=/trunk/mono/; revision=121245

mono/metadata/ChangeLog
mono/metadata/object.c
mono/metadata/sgen-gc.c

index 3c6e20938c6acff1ceb7e0c09e7b1b14bb3dc851..1da603d9026a5b12deb0a95fba61e2978f579acc 100644 (file)
@@ -1,6 +1,14 @@
+2008-12-10  Zoltan Varga  <vargaz@gmail.com>
+
+       * sgen-gc.c (build_nursery_fragments): Clear nursery_next/nursery_frag_real_end.
+
+       * sgen-gc.c (check_object): New debugging helper function.
+
+       * object.c: Fix calls to mono_value_copy_array ().
+
 2008-12-10 Rodrigo Kumpera  <rkumpera@novell.com>
 
-       class.c (mono_class_setup_fields): It working on an inflated class
+       class.c (mono_class_setup_fields): If working on an inflated class
        first check if the generic definition did init with success.
 
        Fixes #445361.
index 26d7935f621badb464ae71e897b2250fc60fee90..f71e79370c4ea45cb2cadba16b9c689e8d59ef52 100644 (file)
@@ -3782,7 +3782,7 @@ mono_array_full_copy (MonoArray *src, MonoArray *dest)
 #ifdef HAVE_SGEN_GC
        if (klass->element_class->valuetype) {
                if (klass->element_class->has_references)
-                       mono_value_copy_array (dest, 0, src, mono_array_length (src));
+                       mono_value_copy_array (dest, 0, mono_array_addr_with_size (src, 0, 0), mono_array_length (src));
                else
                        memcpy (&dest->vector, &src->vector, size);
        } else {
@@ -3819,7 +3819,7 @@ mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array)
 #ifdef HAVE_SGEN_GC
                if (klass->element_class->valuetype) {
                        if (klass->element_class->has_references)
-                               mono_value_copy_array (o, 0, array, mono_array_length (array));
+                               mono_value_copy_array (o, 0, mono_array_addr_with_size (array, 0, 0), mono_array_length (array));
                        else
                                memcpy (&o->vector, &array->vector, size);
                } else {
@@ -3842,7 +3842,7 @@ mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array)
 #ifdef HAVE_SGEN_GC
        if (klass->element_class->valuetype) {
                if (klass->element_class->has_references)
-                       mono_value_copy_array (o, 0, array, mono_array_length (array));
+                       mono_value_copy_array (o, 0, mono_array_addr_with_size (array, 0, 0), mono_array_length (array));
                else
                        memcpy (&o->vector, &array->vector, size);
        } else {
@@ -4278,8 +4278,8 @@ mono_value_copy (gpointer dest, gpointer src, MonoClass *klass)
  * @src: source pointer
  * @count: number of items
  *
- * Copy @count valuetype items from @src to @dest. This function must be used
- * when @klass contains references fields.
+ * Copy @count valuetype items from @src to the array @dest at index @dest_idx. 
+ * This function must be used when @klass contains references fields.
  * Overlap is handled.
  */
 void
index e52237c67b3650df4884701102879253dde1a746..b3f3d8d4e48cd2ec011356f5b40ab080c619f675 100644 (file)
@@ -675,7 +675,9 @@ static void sweep_pinned_objects (void);
 static void free_large_object (LOSObject *obj);
 static void free_mem_section (GCMemSection *section);
 
+void describe_ptr (char *ptr);
 void check_consistency (void);
+char* check_object (char *start);
 
 /*
  * ######################################################################
@@ -2133,6 +2135,8 @@ build_nursery_fragments (int start_pin, int end_pin)
                degraded_mode = 1;
        }
 
+       nursery_next = nursery_frag_real_end = NULL;
+
        /* Clear TLABs for all threads */
        clear_tlabs ();
 }
@@ -2589,8 +2593,6 @@ minor_collect_or_expand_inner (size_t size)
                                DEBUG (3, fprintf (gc_debug_file, "Bastard pinning obj %p (%s), size: %d\n", pin_queue [i], safe_name (pin_queue [i]), safe_object_get_size (pin_queue [i])));
                        }
                        degraded_mode = 1;
-                       /* This is needed by collect_nursery () to calculate nursery_last_allocated */
-                       nursery_next = nursery_frag_real_end = NULL;
                }
        }
        //report_internal_mem_usage ();
@@ -3204,7 +3206,8 @@ mono_gc_alloc_obj (MonoVTable *vtable, size_t size)
                                if (nursery_clear_policy == CLEAR_AT_TLAB_CREATION)
                                        memset (p, 0, size);
                        } else {
-                               DEBUG (3, fprintf (gc_debug_file, "Retire TLAB: %p-%p [%ld]\n", tlab_start, tlab_real_end, (long)(tlab_real_end - tlab_next - size)));
+                               if (tlab_start)
+                                       DEBUG (3, fprintf (gc_debug_file, "Retire TLAB: %p-%p [%ld]\n", tlab_start, tlab_real_end, (long)(tlab_real_end - tlab_next - size)));
 
                                if (nursery_next + tlab_size >= nursery_frag_real_end) {
                                        res = search_fragment_for_size (tlab_size);
@@ -4409,7 +4412,7 @@ mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
                *(void**)ptr = value;
                return;
        }
-       DEBUG (8, fprintf (gc_debug_file, "Adding remset at %p\n", ptr));
+       DEBUG (8, fprintf (gc_debug_file, "Adding remset at %p (%s)\n", ptr, value ? safe_name (value) : "null"));
        /* FIXME: ensure it is on the heap */
        if (rs->store_next < rs->end_set) {
                *(rs->store_next++) = (mword)ptr;
@@ -4753,6 +4756,79 @@ check_consistency (void)
        DEBUG (1, fprintf (gc_debug_file, "Heap consistency check done.\n"));
 }
 
+/* Check that the reference is valid */
+#undef HANDLE_PTR
+#define HANDLE_PTR(ptr,obj)    do {    \
+               if (*(ptr)) {   \
+                       g_assert (safe_name (*(ptr)) != NULL);  \
+               }       \
+       } while (0)
+
+/*
+ * check_object:
+ *
+ *   Perform consistency check on an object. Currently we only check that the
+ * reference fields are valid.
+ */
+char*
+check_object (char *start)
+{
+       GCVTable *vt;
+       size_t skip_size;
+       mword desc;
+
+       if (!start)
+               return NULL;
+
+       vt = (GCVTable*)LOAD_VTABLE (start);
+       //type = vt->desc & 0x7;
+
+       desc = vt->desc;
+       switch (desc & 0x7) {
+       case DESC_TYPE_STRING:
+               STRING_SIZE (skip_size, start);
+               return start + skip_size;
+       case DESC_TYPE_RUN_LENGTH:
+               OBJ_RUN_LEN_FOREACH_PTR (desc,start);
+               OBJ_RUN_LEN_SIZE (skip_size, desc, start);
+               g_assert (skip_size);
+               return start + skip_size;
+       case DESC_TYPE_ARRAY:
+       case DESC_TYPE_VECTOR:
+               OBJ_VECTOR_FOREACH_PTR (vt, start);
+               skip_size = safe_object_get_size ((MonoObject*)start);
+               skip_size += (ALLOC_ALIGN - 1);
+               skip_size &= ~(ALLOC_ALIGN - 1);
+               return start + skip_size;
+       case DESC_TYPE_SMALL_BITMAP:
+               OBJ_BITMAP_FOREACH_PTR (desc,start);
+               OBJ_BITMAP_SIZE (skip_size, desc, start);
+               return start + skip_size;
+       case DESC_TYPE_LARGE_BITMAP:
+               OBJ_LARGE_BITMAP_FOREACH_PTR (vt,start);
+               skip_size = safe_object_get_size ((MonoObject*)start);
+               skip_size += (ALLOC_ALIGN - 1);
+               skip_size &= ~(ALLOC_ALIGN - 1);
+               return start + skip_size;
+       case DESC_TYPE_COMPLEX:
+               OBJ_COMPLEX_FOREACH_PTR (vt, start);
+               /* this is a complex object */
+               skip_size = safe_object_get_size ((MonoObject*)start);
+               skip_size += (ALLOC_ALIGN - 1);
+               skip_size &= ~(ALLOC_ALIGN - 1);
+               return start + skip_size;
+       case DESC_TYPE_COMPLEX_ARR:
+               OBJ_COMPLEX_ARR_FOREACH_PTR (vt, start);
+               /* this is an array of complex structs */
+               skip_size = safe_object_get_size ((MonoObject*)start);
+               skip_size += (ALLOC_ALIGN - 1);
+               skip_size &= ~(ALLOC_ALIGN - 1);
+               return start + skip_size;
+       }
+       g_assert_not_reached ();
+       return NULL;
+}
+
 /*
  * ######################################################################
  * ########  Other mono public interface functions.