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 ();
104 mono_gc_register_thread (void *baseptr)
106 if (mono_gc_is_gc_thread())
108 #if defined(USE_INCLUDED_LIBGC) && !defined(PLATFORM_WIN32)
109 return GC_thread_register_foreign (baseptr);
115 extern int GC_is_marked (void *p);
118 mono_object_is_alive (MonoObject* o)
120 #ifdef USE_INCLUDED_LIBGC
121 return GC_is_marked (o);
127 #ifdef USE_INCLUDED_LIBGC
130 on_gc_notification (GCEventType event)
132 mono_profiler_gc_event ((MonoGCEvent) event, 0);
136 on_gc_heap_resize (size_t new_size)
138 mono_profiler_gc_heap_resize (new_size);
142 mono_gc_enable_events (void)
144 GC_notify_event = on_gc_notification;
145 GC_on_heap_resize = on_gc_heap_resize;
151 mono_gc_enable_events (void)
158 mono_gc_weak_link_add (void **link_addr, MonoObject *obj)
160 /* libgc requires that we use HIDE_POINTER... */
161 *link_addr = (void*)HIDE_POINTER (obj);
162 GC_GENERAL_REGISTER_DISAPPEARING_LINK (link_addr, obj);
166 mono_gc_weak_link_remove (void **link_addr)
168 GC_unregister_disappearing_link (link_addr);
173 mono_gc_weak_link_get (void **link_addr)
175 MonoObject *obj = REVEAL_POINTER (*link_addr);
176 if (obj == (MonoObject *) -1)
182 mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
188 mono_gc_alloc_fixed (size_t size, void *descr)
190 return GC_MALLOC (size);
194 mono_gc_free_fixed (void* addr)
199 mono_gc_invoke_finalizers (void)
201 /* There is a bug in GC_invoke_finalizer () in versions <= 6.2alpha4:
202 * the 'mem_freed' variable is not initialized when there are no
203 * objects to finalize, which leads to strange behavior later on.
204 * The check is necessary to work around that bug.
206 if (GC_should_invoke_finalizers ())
207 return GC_invoke_finalizers ();
212 mono_gc_pending_finalizers (void)
214 return GC_should_invoke_finalizers ();
218 mono_gc_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObject* value)
220 *(void**)field_ptr = value;
224 mono_gc_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
226 *(void**)slot_ptr = value;
230 mono_gc_wbarrier_arrayref_copy (MonoArray *arr, gpointer slot_ptr, int count)
232 /* no need to do anything */
236 mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
238 *(void**)ptr = value;
242 mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *klass)
246 #endif /* no Boehm GC */