2007-05-01 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / metadata / boehm-gc.c
index 0165cea5b734fcbc943a8e72583f3f37514c1c51..29559e7ef276c917f4339bdee5d616dd8ddaff39 100644 (file)
@@ -9,9 +9,26 @@
 #include <mono/metadata/mono-gc.h>
 #include <mono/metadata/gc-internal.h>
 #include <mono/metadata/profiler-private.h>
+#include <mono/utils/mono-logger.h>
 
 #if HAVE_BOEHM_GC
 
+static void
+mono_gc_warning (char *msg, GC_word arg)
+{
+       mono_trace (G_LOG_LEVEL_WARNING, MONO_TRACE_GC, msg, (unsigned long)arg);
+}
+
+void
+mono_gc_base_init (void)
+{
+       GC_no_dls = TRUE;
+       GC_oom_fn = mono_gc_out_of_memory;
+       GC_set_warn_proc (mono_gc_warning);
+       GC_finalize_on_demand = 1;
+       GC_finalizer_notifier = mono_gc_finalize_notify;
+}
+
 void
 mono_gc_collect (int generation)
 {
@@ -24,6 +41,23 @@ mono_gc_max_generation (void)
        return 0;
 }
 
+int
+mono_gc_get_generation  (MonoObject *object)
+{
+       return 0;
+}
+
+int
+mono_gc_collection_count (int generation)
+{
+       return GC_gc_no;
+}
+
+void
+mono_gc_add_memory_pressure (gint64 value)
+{
+}
+
 gint64
 mono_gc_get_used_size (void)
 {
@@ -56,6 +90,30 @@ mono_gc_enable (void)
 #endif
 }
 
+gboolean
+mono_gc_is_gc_thread (void)
+{
+#ifdef USE_INCLUDED_LIBGC
+       return GC_thread_is_registered ();
+#else
+       return TRUE;
+#endif
+}
+
+extern int GC_thread_register_foreign (void *base_addr);
+
+gboolean
+mono_gc_register_thread (void *baseptr)
+{
+       if (mono_gc_is_gc_thread())
+               return TRUE;
+#if defined(USE_INCLUDED_LIBGC) && !defined(PLATFORM_WIN32)
+       return GC_thread_register_foreign (baseptr);
+#else
+       return FALSE;
+#endif
+}
+
 extern int GC_is_marked (void *p);
 
 gboolean
@@ -110,6 +168,7 @@ void
 mono_gc_weak_link_remove (void **link_addr)
 {
        GC_unregister_disappearing_link (link_addr);
+       *link_addr = NULL;
 }
 
 MonoObject*
@@ -122,7 +181,7 @@ mono_gc_weak_link_get (void **link_addr)
 }
 
 void*
-mono_gc_make_descr_from_bitmap (unsigned int *bitmap, int numbits)
+mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
 {
        return NULL;
 }
@@ -138,5 +197,58 @@ mono_gc_free_fixed (void* addr)
 {
 }
 
+int
+mono_gc_invoke_finalizers (void)
+{
+       /* There is a bug in GC_invoke_finalizer () in versions <= 6.2alpha4:
+        * the 'mem_freed' variable is not initialized when there are no
+        * objects to finalize, which leads to strange behavior later on.
+        * The check is necessary to work around that bug.
+        */
+       if (GC_should_invoke_finalizers ())
+               return GC_invoke_finalizers ();
+       return 0;
+}
+
+gboolean
+mono_gc_pending_finalizers (void)
+{
+       return GC_should_invoke_finalizers ();
+}
+
+void
+mono_gc_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObject* value)
+{
+       *(void**)field_ptr = value;
+}
+
+void
+mono_gc_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
+{
+       *(void**)slot_ptr = value;
+}
+
+void
+mono_gc_wbarrier_arrayref_copy (MonoArray *arr, gpointer slot_ptr, int count)
+{
+       /* no need to do anything */
+}
+
+void
+mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
+{
+       *(void**)ptr = value;
+}
+
+void
+mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *klass)
+{
+}
+
+void
+mono_gc_wbarrier_object (MonoObject *object)
+{
+}
+
 #endif /* no Boehm GC */