2005-06-09 Marek Safar <marek.safar@seznam.cz>
[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 extern int GC_is_marked (void *p);
70
71 gboolean
72 mono_object_is_alive (MonoObject* o)
73 {
74 #ifdef USE_INCLUDED_LIBGC
75         return GC_is_marked (o);
76 #else
77         return TRUE;
78 #endif
79 }
80
81 #ifdef USE_INCLUDED_LIBGC
82
83 static void
84 on_gc_notification (GCEventType event)
85 {
86         mono_profiler_gc_event ((MonoGCEvent) event, 0);
87 }
88  
89 static void
90 on_gc_heap_resize (size_t new_size)
91 {
92         mono_profiler_gc_heap_resize (new_size);
93 }
94
95 void
96 mono_gc_enable_events (void)
97 {
98         GC_notify_event = on_gc_notification;
99         GC_on_heap_resize = on_gc_heap_resize;
100 }
101
102 #else
103
104 void
105 mono_gc_enable_events (void)
106 {
107 }
108
109 #endif
110
111 void
112 mono_gc_weak_link_add (void **link_addr, MonoObject *obj)
113 {
114         /* libgc requires that we use HIDE_POINTER... */
115         *link_addr = (void*)HIDE_POINTER (obj);
116         GC_GENERAL_REGISTER_DISAPPEARING_LINK (link_addr, obj);
117 }
118
119 void
120 mono_gc_weak_link_remove (void **link_addr)
121 {
122         GC_unregister_disappearing_link (link_addr);
123 }
124
125 MonoObject*
126 mono_gc_weak_link_get (void **link_addr)
127 {
128         MonoObject *obj = REVEAL_POINTER (*link_addr);
129         if (obj == (MonoObject *) -1)
130                 return NULL;
131         return obj;
132 }
133
134 void*
135 mono_gc_make_descr_from_bitmap (unsigned int *bitmap, int numbits)
136 {
137         return NULL;
138 }
139
140 void*
141 mono_gc_alloc_fixed (size_t size, void *descr)
142 {
143         return GC_MALLOC (size);
144 }
145
146 void
147 mono_gc_free_fixed (void* addr)
148 {
149 }
150
151 #endif /* no Boehm GC */
152