[sgen] Move `do_pin_stats` flag into `sgen-pinning-stats.c`.
[mono.git] / mono / metadata / boehm-gc.c
index 090f2f7a1dc98e9296d02c829debb4cba317c11c..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,9 +764,10 @@ 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);
@@ -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)
 {