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>
16 mono_gc_collect (int generation)
22 mono_gc_max_generation (void)
28 mono_gc_get_used_size (void)
30 return GC_get_heap_size () - GC_get_free_bytes ();
34 mono_gc_get_heap_size (void)
36 return GC_get_heap_size ();
40 mono_gc_disable (void)
45 g_assert_not_reached ();
55 g_assert_not_reached ();
60 mono_gc_is_gc_thread (void)
62 #ifdef USE_INCLUDED_LIBGC
63 return GC_thread_is_registered ();
70 mono_gc_register_thread (void *baseptr)
72 if (mono_gc_is_gc_thread())
74 #if defined(USE_INCLUDED_LIBGC) && !defined(PLATFORM_WIN32)
75 return GC_thread_register_foreign (baseptr);
81 extern int GC_is_marked (void *p);
84 mono_object_is_alive (MonoObject* o)
86 #ifdef USE_INCLUDED_LIBGC
87 return GC_is_marked (o);
93 #ifdef USE_INCLUDED_LIBGC
96 on_gc_notification (GCEventType event)
98 mono_profiler_gc_event ((MonoGCEvent) event, 0);
102 on_gc_heap_resize (size_t new_size)
104 mono_profiler_gc_heap_resize (new_size);
108 mono_gc_enable_events (void)
110 GC_notify_event = on_gc_notification;
111 GC_on_heap_resize = on_gc_heap_resize;
117 mono_gc_enable_events (void)
124 mono_gc_weak_link_add (void **link_addr, MonoObject *obj)
126 /* libgc requires that we use HIDE_POINTER... */
127 *link_addr = (void*)HIDE_POINTER (obj);
128 GC_GENERAL_REGISTER_DISAPPEARING_LINK (link_addr, obj);
132 mono_gc_weak_link_remove (void **link_addr)
134 GC_unregister_disappearing_link (link_addr);
138 mono_gc_weak_link_get (void **link_addr)
140 MonoObject *obj = REVEAL_POINTER (*link_addr);
141 if (obj == (MonoObject *) -1)
147 mono_gc_make_descr_from_bitmap (unsigned int *bitmap, int numbits)
153 mono_gc_alloc_fixed (size_t size, void *descr)
155 return GC_MALLOC (size);
159 mono_gc_free_fixed (void* addr)
163 #endif /* no Boehm GC */