Browse Source

2007-12-26 Zoltan Varga <[email protected]>

	* gc-internal.h: Change the signature of mono_gc_make_descr_for_string ()
	to take the same arguments as the other make_descr functions.

	* boehm-gc.c null-gc.c: Add implementation for make_descr functions.

	* objects.c: Get rid of the MAKE_DESCRIPTOR macros, call make_descr functions
	directly.

svn path=/trunk/mono/; revision=91888
Zoltan Varga 18 years ago
parent
commit
74bc60445f

+ 8 - 0
mono/metadata/ChangeLog

@@ -1,5 +1,13 @@
 2007-12-26  Zoltan Varga  <[email protected]>
 
+	* gc-internal.h: Change the signature of mono_gc_make_descr_for_string ()
+	to take the same arguments as the other make_descr functions.
+
+	* boehm-gc.c null-gc.c: Add implementation for make_descr functions.
+
+	* objects.c: Get rid of the MAKE_DESCRIPTOR macros, call make_descr functions
+	directly.
+
 	* boehm-gc.c (mono_gc_base_init): Moved the setting of GC_stackbottom here from
 	mini.c.
 

+ 23 - 2
mono/metadata/boehm-gc.c

@@ -23,6 +23,8 @@
 #include "private/pthread_support.h"
 #endif
 
+#define GC_NO_DESCRIPTOR ((gpointer)(0 | GC_DS_LENGTH))
+
 static gboolean gc_initialized = FALSE;
 
 static void
@@ -190,7 +192,7 @@ gboolean
 mono_object_is_alive (MonoObject* o)
 {
 #ifdef USE_INCLUDED_LIBGC
-	return GC_is_marked (o);
+	return GC_is_marked ((gpointer)o);
 #else
 	return TRUE;
 #endif
@@ -259,10 +261,30 @@ mono_gc_weak_link_get (void **link_addr)
 	return obj;
 }
 
+void*
+mono_gc_make_descr_for_string (gsize *bitmap, int numbits)
+{
+	return mono_gc_make_descr_from_bitmap (bitmap, numbits);
+}
+
+void*
+mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size)
+{
+	return mono_gc_make_descr_from_bitmap (bitmap, numbits);
+}
+
 void*
 mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
 {
+#ifdef HAVE_GC_GCJ_MALLOC
+	/* It seems there are issues when the bitmap doesn't fit: play it safe */
+	if (numbits >= 30)
+		return GC_NO_DESCRIPTOR;
+	else
+		return (gpointer)GC_make_descriptor ((GC_bitmap)bitmap, numbits);
+#else
 	return NULL;
+#endif
 }
 
 void*
@@ -551,7 +573,6 @@ create_allocator (int atype, int offset)
 }
 
 static MonoMethod* alloc_method_cache [ATYPE_NUM];
-#define GC_NO_DESCRIPTOR ((gpointer)(0 | GC_DS_LENGTH))
 
 /*
  * If possible, generate a managed method that can quickly allocate objects in class

+ 1 - 1
mono/metadata/gc-internal.h

@@ -78,7 +78,7 @@ void     mono_gc_finalize_notify    (void) MONO_INTERNAL;
 
 void* mono_gc_alloc_pinned_obj (MonoVTable *vtable, size_t size) MONO_INTERNAL;
 void* mono_gc_alloc_obj (MonoVTable *vtable, size_t size) MONO_INTERNAL;
-void* mono_gc_make_descr_for_string (void) MONO_INTERNAL;
+void* mono_gc_make_descr_for_string (gsize *bitmap, int numbits) MONO_INTERNAL;
 void* mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size) MONO_INTERNAL;
 void* mono_gc_make_descr_for_array (int vector, gsize *elem_bitmap, int numbits, size_t elem_size) MONO_INTERNAL;
 

+ 12 - 0
mono/metadata/null-gc.c

@@ -113,6 +113,18 @@ mono_gc_weak_link_get (void **link_addr)
 	return *link_addr;
 }
 
+void*
+mono_gc_make_descr_for_string (gsize *bitmap, int numbits)
+{
+	return NULL;
+}
+
+void*
+mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size)
+{
+	return NULL;
+}
+
 void*
 mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
 {

+ 6 - 19
mono/metadata/object.c

@@ -44,13 +44,9 @@
 #define CREATION_SPEEDUP 1
 #define GC_NO_DESCRIPTOR ((gpointer)(0 | GC_DS_LENGTH))
 #define ALLOC_TYPED(dest,size,type) do { (dest) = GC_GCJ_MALLOC ((size),(type)); } while (0)
-#define MAKE_STRING_DESCRIPTOR(bitmap,sz) GC_make_descriptor((GC_bitmap)(bitmap),(sz))
-#define MAKE_DESCRIPTOR(bitmap,sz,objsize) GC_make_descriptor((GC_bitmap)(bitmap),(sz))
 #else
 #define GC_NO_DESCRIPTOR (NULL)
 #define ALLOC_TYPED(dest,size,type) do { (dest) = GC_MALLOC ((size)); *(gpointer*)dest = (type);} while (0)
-#define MAKE_STRING_DESCRIPTOR(bitmap,sz) NULL
-#define MAKE_DESCRIPTOR(bitmap,sz,objsize) NULL
 #endif
 #else
 #ifdef HAVE_SGEN_GC
@@ -58,16 +54,12 @@
 #define ALLOC_PTRFREE(obj,vt,size) do { (obj) = mono_gc_alloc_obj (vt, size);} while (0)
 #define ALLOC_OBJECT(obj,vt,size) do { (obj) = mono_gc_alloc_obj (vt, size);} while (0)
 #define ALLOC_TYPED(dest,size,type) do { (dest) = mono_gc_alloc_obj (type, size);} while (0)
-#define MAKE_STRING_DESCRIPTOR(bitmap,sz) mono_gc_make_descr_for_string ()
-#define MAKE_DESCRIPTOR(bitmap,sz,objsize) mono_gc_make_descr_for_object ((bitmap), (sz), (objsize))
 #else
 #define NEED_TO_ZERO_PTRFREE 1
 #define GC_NO_DESCRIPTOR (NULL)
 #define ALLOC_PTRFREE(obj,vt,size) do { (obj) = malloc ((size)); (obj)->vtable = (vt); (obj)->synchronisation = NULL;} while (0)
 #define ALLOC_OBJECT(obj,vt,size) do { (obj) = calloc (1, (size)); (obj)->vtable = (vt);} while (0)
 #define ALLOC_TYPED(dest,size,type) do { (dest) = calloc (1, (size)); *(gpointer*)dest = (type);} while (0)
-#define MAKE_STRING_DESCRIPTOR(bitmap,sz) NULL
-#define MAKE_DESCRIPTOR(bitmap,sz,objsize) NULL
 #endif
 #endif
 
@@ -888,7 +880,7 @@ mono_class_compute_gc_descriptor (MonoClass *class)
 
 	bitmap = default_bitmap;
 	if (class == mono_defaults.string_class) {
-		class->gc_descr = (gpointer)MAKE_STRING_DESCRIPTOR (bitmap, 2);
+		class->gc_descr = (gpointer)mono_gc_make_descr_for_string (bitmap, 2);
 	} else if (class->rank) {
 		mono_class_compute_gc_descriptor (class->element_class);
 #ifdef HAVE_SGEN_GC
@@ -913,16 +905,11 @@ mono_class_compute_gc_descriptor (MonoClass *class)
 		if (count++ > 58)
 			return;*/
 		bitmap = compute_class_bitmap (class, default_bitmap, sizeof (default_bitmap) * 8, 0, &max_set, FALSE);
-#ifdef HAVE_BOEHM_GC
-		/* It seems there are issues when the bitmap doesn't fit: play it safe */
-		if (max_set >= 30) {
-			/*g_print ("disabling typed alloc (%d) for %s.%s\n", max_set, class->name_space, class->name);*/
-			if (bitmap != default_bitmap)
-				g_free (bitmap);
-			return;
-		}
-#endif
-		class->gc_descr = (gpointer)MAKE_DESCRIPTOR (bitmap, max_set + 1, class->instance_size);
+		class->gc_descr = (gpointer)mono_gc_make_descr_for_object (bitmap, max_set + 1, class->instance_size);
+		/*
+		if (class->gc_descr == GC_NO_DESCRIPTOR)
+			g_print ("disabling typed alloc (%d) for %s.%s\n", max_set, class->name_space, class->name);
+		*/
 		/*printf ("new descriptor: %p 0x%x for %s.%s\n", class->gc_descr, bitmap [0], class->name_space, class->name);*/
 		if (bitmap != default_bitmap)
 			g_free (bitmap);

+ 1 - 1
mono/metadata/sgen-gc.c

@@ -733,7 +733,7 @@ alloc_complex_descriptor (gsize *bitmap, int numbits)
  * Descriptor builders.
  */
 void*
-mono_gc_make_descr_for_string (void)
+mono_gc_make_descr_for_string (gsize *bitmap, int numbits)
 {
 	return (void*) DESC_TYPE_STRING;
 }