[sgen] Move `do_pin_stats` flag into `sgen-pinning-stats.c`.
[mono.git] / mono / metadata / boehm-gc.c
index 3320820f87797e0583a2fe745a242e1f1a700b8f..e62c554ca1e3a66e8fd0497041bde6f52ea1c4ff 100644 (file)
@@ -30,6 +30,7 @@
 #include <mono/utils/dtrace.h>
 #include <mono/utils/gc_wrapper.h>
 #include <mono/utils/mono-mutex.h>
+#include <mono/utils/mono-counters.h>
 
 #if HAVE_BOEHM_GC
 
@@ -78,6 +79,8 @@ mono_gc_base_init (void)
        if (gc_initialized)
                return;
 
+       mono_counters_init ();
+
        /*
         * Handle the case when we are called from a thread different from the main thread,
         * confusing libgc.
@@ -145,7 +148,22 @@ mono_gc_base_init (void)
        /* If GC_no_dls is set to true, GC_find_limit is not called. This causes a seg fault on Android. */
        GC_no_dls = TRUE;
 #endif
+       {
+               if ((env = g_getenv ("MONO_GC_DEBUG"))) {
+                       char **opts = g_strsplit (env, ",", -1);
+                       for (char **ptr = opts; ptr && *ptr; ptr ++) {
+                               char *opt = *ptr;
+                               if (!strcmp (opt, "do-not-finalize")) {
+                                       do_not_finalize = 1;
+                               } else if (!strcmp (opt, "log-finalizers")) {
+                                       log_finalizers = 1;
+                               }
+                       }
+               }
+       }
+
        GC_init ();
+
        GC_oom_fn = mono_gc_out_of_memory;
        GC_set_warn_proc (mono_gc_warning);
        GC_finalize_on_demand = 1;
@@ -458,6 +476,8 @@ on_gc_notification (GCEventType event)
                gc_stats.major_gc_time += mono_100ns_ticks () - gc_start_time;
                mono_trace_message (MONO_TRACE_GC, "gc took %d usecs", (mono_100ns_ticks () - gc_start_time) / 10);
                break;
+       default:
+               break;
        }
 
        mono_profiler_gc_event (e, 0);
@@ -744,16 +764,17 @@ create_allocator (int atype, int tls_key)
                csig->params [0] = &mono_defaults.int_class->byval_arg;
                csig->params [1] = &mono_defaults.int32_class->byval_arg;
        } else {
-               csig = mono_metadata_signature_alloc (mono_defaults.corlib, 1);
+               csig = mono_metadata_signature_alloc (mono_defaults.corlib, 2);
                csig->ret = &mono_defaults.object_class->byval_arg;
                csig->params [0] = &mono_defaults.int_class->byval_arg;
+               csig->params [1] = &mono_defaults.int32_class->byval_arg;
        }
 
        mb = mono_mb_new (mono_defaults.object_class, "Alloc", MONO_WRAPPER_ALLOC);
        bytes_var = mono_mb_add_local (mb, &mono_defaults.int32_class->byval_arg);
        if (atype == ATYPE_STRING) {
                /* a string alloator method takes the args: (vtable, len) */
-               /* bytes = (sizeof (MonoString) + ((len + 1) * 2)); */
+               /* bytes = (offsetof (MonoString, chars) + ((len + 1) * 2)); */
                mono_mb_emit_ldarg (mb, 1);
                mono_mb_emit_icon (mb, 1);
                mono_mb_emit_byte (mb, MONO_CEE_ADD);
@@ -764,15 +785,7 @@ create_allocator (int atype, int tls_key)
                mono_mb_emit_byte (mb, MONO_CEE_ADD);
                mono_mb_emit_stloc (mb, bytes_var);
        } else {
-               /* bytes = vtable->klass->instance_size */
-               mono_mb_emit_ldarg (mb, 0);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoVTable, klass));
-               mono_mb_emit_byte (mb, MONO_CEE_ADD);
-               mono_mb_emit_byte (mb, MONO_CEE_LDIND_I);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoClass, instance_size));
-               mono_mb_emit_byte (mb, MONO_CEE_ADD);
-               /* FIXME: assert instance_size stays a 4 byte integer */
-               mono_mb_emit_byte (mb, MONO_CEE_LDIND_U4);
+               mono_mb_emit_ldarg (mb, 1);
                mono_mb_emit_stloc (mb, bytes_var);
        }
 
@@ -958,7 +971,7 @@ mono_gc_is_critical_method (MonoMethod *method)
  */
 
 MonoMethod*
-mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box)
+mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size)
 {
        int offset = -1;
        int atype;
@@ -1055,7 +1068,7 @@ mono_gc_is_critical_method (MonoMethod *method)
 }
 
 MonoMethod*
-mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box)
+mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size)
 {
        return NULL;
 }
@@ -1087,6 +1100,19 @@ mono_gc_get_write_barrier (void)
 
 #endif
 
+MonoMethod*
+mono_gc_get_specific_write_barrier (gboolean is_concurrent)
+{
+       g_assert_not_reached ();
+       return NULL;
+}
+
+int
+mono_gc_get_aligned_size_for_allocator (int size)
+{
+       return size;
+}
+
 const char *
 mono_gc_get_gc_name (void)
 {
@@ -1291,6 +1317,18 @@ mono_gc_get_los_limit (void)
        return G_MAXINT;
 }
 
+void
+mono_gc_set_string_length (MonoString *str, gint32 new_length)
+{
+       mono_unichar2 *new_end = str->chars + new_length;
+       
+       /* zero the discarded string. This null-delimits the string and allows 
+        * the space to be reclaimed by SGen. */
+        
+       memset (new_end, 0, (str->length - new_length + 1) * sizeof (mono_unichar2));
+       str->length = new_length;
+}
+
 gboolean
 mono_gc_user_markers_supported (void)
 {