patch-quiet now works in systems with 'gsed'
[mono.git] / mono / metadata / boehm-gc.c
index 29ddb8a43a927b86d93de6b6868b0d67cf0a0af6..641d10baa075a6dba13c2d96c032b0dcf1a12274 100644 (file)
@@ -35,6 +35,9 @@
 #endif
 
 #define GC_NO_DESCRIPTOR ((gpointer)(0 | GC_DS_LENGTH))
+/*Boehm max heap cannot be smaller than 16MB*/
+#define MIN_BOEHM_MAX_HEAP_SIZE_IN_MB 16
+#define MIN_BOEHM_MAX_HEAP_SIZE (MIN_BOEHM_MAX_HEAP_SIZE_IN_MB << 20)
 
 static gboolean gc_initialized = FALSE;
 
@@ -47,6 +50,8 @@ mono_gc_warning (char *msg, GC_word arg)
 void
 mono_gc_base_init (void)
 {
+       char *env;
+
        if (gc_initialized)
                return;
 
@@ -100,6 +105,8 @@ mono_gc_base_init (void)
 
                GC_stackbottom = (char*)ss.ss_sp;
        }
+#elif defined(__native_client__)
+       /* Do nothing, GC_stackbottom is set correctly in libgc */
 #else
        {
                int dummy;
@@ -124,6 +131,39 @@ mono_gc_base_init (void)
 #ifdef HAVE_GC_GCJ_MALLOC
        GC_init_gcj_malloc (5, NULL);
 #endif
+
+#ifdef HAVE_GC_ALLOW_REGISTER_THREADS
+       GC_allow_register_threads();
+#endif
+
+       if ((env = getenv ("MONO_GC_PARAMS"))) {
+               char **ptr, **opts = g_strsplit (env, ",", -1);
+               for (ptr = opts; *ptr; ++ptr) {
+                       char *opt = *ptr;
+                       if (g_str_has_prefix (opt, "max-heap-size=")) {
+                               glong max_heap;
+
+                               opt = strchr (opt, '=') + 1;
+                               if (*opt && mono_gc_parse_environment_string_extract_number (opt, &max_heap)) {
+                                       if (max_heap < MIN_BOEHM_MAX_HEAP_SIZE) {
+                                               fprintf (stderr, "max-heap-size must be at least %dMb.\n", MIN_BOEHM_MAX_HEAP_SIZE_IN_MB);
+                                               exit (1);
+                                       }
+                                       GC_set_max_heap_size (max_heap);
+                               } else {
+                                       fprintf (stderr, "max-heap-size must be an integer.\n");
+                                       exit (1);
+                               }
+                               continue;
+                       } else {
+                               fprintf (stderr, "MONO_GC_PARAMS must be a comma-delimited list of one or more of the following:\n");
+                               fprintf (stderr, "  max-heap-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
+                               exit (1);
+                       }
+               }
+               g_strfreev (opts);
+       }
+
        mono_gc_enable_events ();
        gc_initialized = TRUE;
 }
@@ -925,7 +965,7 @@ mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box)
                return NULL;
        if (!SMALL_ENOUGH (klass->instance_size))
                return NULL;
-       if (klass->has_finalize || klass->marshalbyref || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS))
+       if (mono_class_has_finalizer (klass) || klass->marshalbyref || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS))
                return NULL;
        if (klass->rank)
                return NULL;
@@ -1069,6 +1109,57 @@ mono_gc_wbarrier_value_copy_bitmap (gpointer _dest, gpointer _src, int size, uns
        g_assert_not_reached ();
 }
 
+
+guint8*
+mono_gc_get_card_table (int *shift_bits, gpointer *card_mask)
+{
+       g_assert_not_reached ();
+       return NULL;
+}
+
+void*
+mono_gc_get_nursery (int *shift_bits, size_t *size)
+{
+       return NULL;
+}
+
+gboolean
+mono_gc_precise_stack_mark_enabled (void)
+{
+       return FALSE;
+}
+
+FILE *
+mono_gc_get_logfile (void)
+{
+       return NULL;
+}
+
+void
+mono_gc_conservatively_scan_area (void *start, void *end)
+{
+       g_assert_not_reached ();
+}
+
+void *
+mono_gc_scan_object (void *obj)
+{
+       g_assert_not_reached ();
+       return NULL;
+}
+
+gsize*
+mono_gc_get_bitmap_for_descr (void *descr, int *numbits)
+{
+       g_assert_not_reached ();
+       return NULL;
+}
+
+void
+mono_gc_set_gc_callbacks (MonoGCCallbacks *callbacks)
+{
+}
+
 /*
  * These will call the redefined versions in libgc.
  */
@@ -1095,4 +1186,11 @@ mono_gc_pthread_detach (pthread_t thread)
 
 #endif
 
+#ifdef HOST_WIN32
+BOOL APIENTRY mono_gc_dllmain (HMODULE module_handle, DWORD reason, LPVOID reserved)
+{
+       return GC_DllMain (module_handle, reason, reserved);
+}
+#endif
+
 #endif /* no Boehm GC */