2005-11-23 Raja R Harinath <rharinath@novell.com>
[mono.git] / mono / metadata / boehm-gc.c
1 /*
2  * boehm-gc.c: GC implementation using either the installed or included Boehm GC.
3  *
4  */
5
6 #include "config.h"
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
13 #if HAVE_BOEHM_GC
14
15 void
16 mono_gc_collect (int generation)
17 {
18         GC_gcollect ();
19 }
20
21 int
22 mono_gc_max_generation (void)
23 {
24         return 0;
25 }
26
27 gint64
28 mono_gc_get_used_size (void)
29 {
30         return GC_get_heap_size () - GC_get_free_bytes ();
31 }
32
33 gint64
34 mono_gc_get_heap_size (void)
35 {
36         return GC_get_heap_size ();
37 }
38
39 void
40 mono_gc_disable (void)
41 {
42 #ifdef HAVE_GC_ENABLE
43         GC_disable ();
44 #else
45         g_assert_not_reached ();
46 #endif
47 }
48
49 void
50 mono_gc_enable (void)
51 {
52 #ifdef HAVE_GC_ENABLE
53         GC_enable ();
54 #else
55         g_assert_not_reached ();
56 #endif
57 }
58
59 gboolean
60 mono_gc_is_gc_thread (void)
61 {
62 #ifdef USE_INCLUDED_LIBGC
63         return GC_thread_is_registered ();
64 #else
65         return TRUE;
66 #endif
67 }
68
69 gboolean
70 mono_gc_register_thread (void *baseptr)
71 {
72         if (mono_gc_is_gc_thread())
73                 return TRUE;
74 #if defined(USE_INCLUDED_LIBGC) && !defined(PLATFORM_WIN32)
75         return GC_thread_register_foreign (baseptr);
76 #else
77         return FALSE;
78 #endif
79 }
80
81 extern int GC_is_marked (void *p);
82
83 gboolean
84 mono_object_is_alive (MonoObject* o)
85 {
86 #ifdef USE_INCLUDED_LIBGC
87         return GC_is_marked (o);
88 #else
89         return TRUE;
90 #endif
91 }
92
93 #ifdef USE_INCLUDED_LIBGC
94
95 static void
96 on_gc_notification (GCEventType event)
97 {
98         mono_profiler_gc_event ((MonoGCEvent) event, 0);
99 }
100  
101 static void
102 on_gc_heap_resize (size_t new_size)
103 {
104         mono_profiler_gc_heap_resize (new_size);
105 }
106
107 void
108 mono_gc_enable_events (void)
109 {
110         GC_notify_event = on_gc_notification;
111         GC_on_heap_resize = on_gc_heap_resize;
112 }
113
114 #else
115
116 void
117 mono_gc_enable_events (void)
118 {
119 }
120
121 #endif
122
123 void
124 mono_gc_weak_link_add (void **link_addr, MonoObject *obj)
125 {
126         /* libgc requires that we use HIDE_POINTER... */
127         *link_addr = (void*)HIDE_POINTER (obj);
128         GC_GENERAL_REGISTER_DISAPPEARING_LINK (link_addr, obj);
129 }
130
131 void
132 mono_gc_weak_link_remove (void **link_addr)
133 {
134         GC_unregister_disappearing_link (link_addr);
135 }
136
137 MonoObject*
138 mono_gc_weak_link_get (void **link_addr)
139 {
140         MonoObject *obj = REVEAL_POINTER (*link_addr);
141         if (obj == (MonoObject *) -1)
142                 return NULL;
143         return obj;
144 }
145
146 void*
147 mono_gc_make_descr_from_bitmap (unsigned int *bitmap, int numbits)
148 {
149         return NULL;
150 }
151
152 void*
153 mono_gc_alloc_fixed (size_t size, void *descr)
154 {
155         return GC_MALLOC (size);
156 }
157
158 void
159 mono_gc_free_fixed (void* addr)
160 {
161 }
162
163 #endif /* no Boehm GC */
164