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_generation (MonoObject *object)
51 mono_gc_collection_count (int generation)
57 mono_gc_add_memory_pressure (gint64 value)
62 mono_gc_get_used_size (void)
64 return GC_get_heap_size () - GC_get_free_bytes ();
68 mono_gc_get_heap_size (void)
70 return GC_get_heap_size ();
74 mono_gc_disable (void)
79 g_assert_not_reached ();
89 g_assert_not_reached ();
94 mono_gc_is_gc_thread (void)
96 #ifdef USE_INCLUDED_LIBGC
97 return GC_thread_is_registered ();
103 extern int GC_thread_register_foreign (void *base_addr);
106 mono_gc_register_thread (void *baseptr)
108 if (mono_gc_is_gc_thread())
110 #if defined(USE_INCLUDED_LIBGC) && !defined(PLATFORM_WIN32)
111 return GC_thread_register_foreign (baseptr);
117 extern int GC_is_marked (void *p);
120 mono_object_is_alive (MonoObject* o)
122 #ifdef USE_INCLUDED_LIBGC
123 return GC_is_marked (o);
129 #ifdef USE_INCLUDED_LIBGC
132 on_gc_notification (GCEventType event)
134 mono_profiler_gc_event ((MonoGCEvent) event, 0);
138 on_gc_heap_resize (size_t new_size)
140 mono_profiler_gc_heap_resize (new_size);
144 mono_gc_enable_events (void)
146 GC_notify_event = on_gc_notification;
147 GC_on_heap_resize = on_gc_heap_resize;
153 mono_gc_enable_events (void)
160 mono_gc_weak_link_add (void **link_addr, MonoObject *obj)
162 /* libgc requires that we use HIDE_POINTER... */
163 *link_addr = (void*)HIDE_POINTER (obj);
164 GC_GENERAL_REGISTER_DISAPPEARING_LINK (link_addr, obj);
168 mono_gc_weak_link_remove (void **link_addr)
170 GC_unregister_disappearing_link (link_addr);
175 mono_gc_weak_link_get (void **link_addr)
177 MonoObject *obj = REVEAL_POINTER (*link_addr);
178 if (obj == (MonoObject *) -1)
184 mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
190 mono_gc_alloc_fixed (size_t size, void *descr)
192 return GC_MALLOC (size);
196 mono_gc_free_fixed (void* addr)
201 mono_gc_invoke_finalizers (void)
203 /* There is a bug in GC_invoke_finalizer () in versions <= 6.2alpha4:
204 * the 'mem_freed' variable is not initialized when there are no
205 * objects to finalize, which leads to strange behavior later on.
206 * The check is necessary to work around that bug.
208 if (GC_should_invoke_finalizers ())
209 return GC_invoke_finalizers ();
214 mono_gc_pending_finalizers (void)
216 return GC_should_invoke_finalizers ();
220 mono_gc_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObject* value)
222 *(void**)field_ptr = value;
226 mono_gc_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
228 *(void**)slot_ptr = value;
232 mono_gc_wbarrier_arrayref_copy (MonoArray *arr, gpointer slot_ptr, int count)
234 /* no need to do anything */
238 mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
240 *(void**)ptr = value;
244 mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *klass)
249 mono_gc_wbarrier_object (MonoObject *object)
253 #endif /* no Boehm GC */