2 * boehm-gc.c: GC implementation using either the installed or included Boehm GC.
7 #define GC_I_HIDE_POINTERS
8 #include <mono/os/gc_wrapper.h>
9 #include <mono/metadata/mono-gc.h>
10 #include <mono/metadata/gc-internal.h>
11 #include <mono/metadata/profiler-private.h>
12 #include <mono/utils/mono-logger.h>
17 mono_gc_warning (char *msg, GC_word arg)
19 mono_trace (G_LOG_LEVEL_WARNING, MONO_TRACE_GC, msg, (unsigned long)arg);
23 mono_gc_base_init (void)
26 GC_oom_fn = mono_gc_out_of_memory;
27 GC_set_warn_proc (mono_gc_warning);
28 GC_finalize_on_demand = 1;
29 GC_finalizer_notifier = mono_gc_finalize_notify;
33 mono_gc_collect (int generation)
39 mono_gc_max_generation (void)
45 mono_gc_get_used_size (void)
47 return GC_get_heap_size () - GC_get_free_bytes ();
51 mono_gc_get_heap_size (void)
53 return GC_get_heap_size ();
57 mono_gc_disable (void)
62 g_assert_not_reached ();
72 g_assert_not_reached ();
77 mono_gc_is_gc_thread (void)
79 #ifdef USE_INCLUDED_LIBGC
80 return GC_thread_is_registered ();
87 mono_gc_register_thread (void *baseptr)
89 if (mono_gc_is_gc_thread())
91 #if defined(USE_INCLUDED_LIBGC) && !defined(PLATFORM_WIN32)
92 return GC_thread_register_foreign (baseptr);
98 extern int GC_is_marked (void *p);
101 mono_object_is_alive (MonoObject* o)
103 #ifdef USE_INCLUDED_LIBGC
104 return GC_is_marked (o);
110 #ifdef USE_INCLUDED_LIBGC
113 on_gc_notification (GCEventType event)
115 mono_profiler_gc_event ((MonoGCEvent) event, 0);
119 on_gc_heap_resize (size_t new_size)
121 mono_profiler_gc_heap_resize (new_size);
125 mono_gc_enable_events (void)
127 GC_notify_event = on_gc_notification;
128 GC_on_heap_resize = on_gc_heap_resize;
134 mono_gc_enable_events (void)
141 mono_gc_weak_link_add (void **link_addr, MonoObject *obj)
143 /* libgc requires that we use HIDE_POINTER... */
144 *link_addr = (void*)HIDE_POINTER (obj);
145 GC_GENERAL_REGISTER_DISAPPEARING_LINK (link_addr, obj);
149 mono_gc_weak_link_remove (void **link_addr)
151 GC_unregister_disappearing_link (link_addr);
156 mono_gc_weak_link_get (void **link_addr)
158 MonoObject *obj = REVEAL_POINTER (*link_addr);
159 if (obj == (MonoObject *) -1)
165 mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
171 mono_gc_alloc_fixed (size_t size, void *descr)
173 return GC_MALLOC (size);
177 mono_gc_free_fixed (void* addr)
182 mono_gc_invoke_finalizers (void)
184 /* There is a bug in GC_invoke_finalizer () in versions <= 6.2alpha4:
185 * the 'mem_freed' variable is not initialized when there are no
186 * objects to finalize, which leads to strange behavior later on.
187 * The check is necessary to work around that bug.
189 if (GC_should_invoke_finalizers ())
190 return GC_invoke_finalizers ();
195 mono_gc_pending_finalizers (void)
197 return GC_should_invoke_finalizers ();
201 mono_gc_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObject* value)
203 *(void**)field_ptr = value;
207 mono_gc_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
209 *(void**)slot_ptr = value;
213 mono_gc_wbarrier_arrayref_copy (MonoArray *arr, gpointer slot_ptr, int count)
215 /* no need to do anything */
219 mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
221 *(void**)ptr = value;
225 mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *klass)
229 #endif /* no Boehm GC */