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