47d541594cf9aa7956acb144d36d9a171277cedb
[mono.git] / mono / metadata / null-gc.c
1 /*
2  * null-gc.c: GC implementation using malloc: will leak everything, just for testing.
3  *
4  * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
5  * Copyright 2004-2011 Novell, Inc (http://www.novell.com)
6  * Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
7  */
8
9 #include "config.h"
10 #include <glib.h>
11 #include <mono/metadata/mono-gc.h>
12 #include <mono/metadata/gc-internal.h>
13 #include <mono/metadata/runtime.h>
14
15 #ifdef HAVE_NULL_GC
16
17 void
18 mono_gc_base_init (void)
19 {
20         MonoThreadInfoCallbacks cb;
21
22         memset (&cb, 0, sizeof (cb));
23         cb.mono_method_is_critical = mono_runtime_is_critical_method;
24         cb.mono_gc_pthread_create = (gpointer)mono_gc_pthread_create;
25 }
26
27 void
28 mono_gc_collect (int generation)
29 {
30 }
31
32 int
33 mono_gc_max_generation (void)
34 {
35         return 0;
36 }
37
38 int
39 mono_gc_get_generation  (MonoObject *object)
40 {
41         return 0;
42 }
43
44 int
45 mono_gc_collection_count (int generation)
46 {
47         return 0;
48 }
49
50 void
51 mono_gc_add_memory_pressure (gint64 value)
52 {
53 }
54
55 /* maybe track the size, not important, though */
56 int64_t
57 mono_gc_get_used_size (void)
58 {
59         return 1024*1024;
60 }
61
62 int64_t
63 mono_gc_get_heap_size (void)
64 {
65         return 2*1024*1024;
66 }
67
68 gboolean
69 mono_gc_is_gc_thread (void)
70 {
71         return TRUE;
72 }
73
74 gboolean
75 mono_gc_register_thread (void *baseptr)
76 {
77         return TRUE;
78 }
79
80 int
81 mono_gc_walk_heap (int flags, MonoGCReferences callback, void *data)
82 {
83         return 1;
84 }
85
86 gboolean
87 mono_object_is_alive (MonoObject* o)
88 {
89         return TRUE;
90 }
91
92 void
93 mono_gc_enable_events (void)
94 {
95 }
96
97 int
98 mono_gc_register_root (char *start, size_t size, void *descr)
99 {
100         return TRUE;
101 }
102
103 void
104 mono_gc_deregister_root (char* addr)
105 {
106 }
107
108 void
109 mono_gc_weak_link_add (void **link_addr, MonoObject *obj, gboolean track)
110 {
111         *link_addr = obj;
112 }
113
114 void
115 mono_gc_weak_link_remove (void **link_addr, gboolean track)
116 {
117         *link_addr = NULL;
118 }
119
120 MonoObject*
121 mono_gc_weak_link_get (void **link_addr)
122 {
123         return *link_addr;
124 }
125
126 void*
127 mono_gc_make_descr_for_string (gsize *bitmap, int numbits)
128 {
129         return NULL;
130 }
131
132 void*
133 mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size)
134 {
135         return NULL;
136 }
137
138 void*
139 mono_gc_make_descr_for_array (int vector, gsize *elem_bitmap, int numbits, size_t elem_size)
140 {
141         return NULL;
142 }
143
144 void*
145 mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
146 {
147         return NULL;
148 }
149
150 void*
151 mono_gc_make_root_descr_all_refs (int numbits)
152 {
153         return NULL;
154 }
155
156 void*
157 mono_gc_alloc_fixed (size_t size, void *descr)
158 {
159         return g_malloc0 (size);
160 }
161
162 void
163 mono_gc_free_fixed (void* addr)
164 {
165         g_free (addr);
166 }
167
168 void
169 mono_gc_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObject* value)
170 {
171         *(void**)field_ptr = value;
172 }
173
174 void
175 mono_gc_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
176 {
177         *(void**)slot_ptr = value;
178 }
179
180 void
181 mono_gc_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int count)
182 {
183         mono_gc_memmove (dest_ptr, src_ptr, count * sizeof (gpointer));
184 }
185
186 void
187 mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
188 {
189         *(void**)ptr = value;
190 }
191
192 void
193 mono_gc_wbarrier_generic_nostore (gpointer ptr)
194 {
195 }
196
197 void
198 mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *klass)
199 {
200         mono_gc_memmove (dest, src, count * mono_class_value_size (klass, NULL));
201 }
202
203 void
204 mono_gc_wbarrier_object_copy (MonoObject* obj, MonoObject *src)
205 {
206         /* do not copy the sync state */
207         mono_gc_memmove ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
208                         mono_object_class (obj)->instance_size - sizeof (MonoObject));
209 }
210
211 gboolean
212 mono_gc_is_critical_method (MonoMethod *method)
213 {
214         return FALSE;
215 }
216
217 MonoMethod*
218 mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box)
219 {
220         return NULL;
221 }
222
223 MonoMethod*
224 mono_gc_get_managed_array_allocator (MonoClass *klass)
225 {
226         return NULL;
227 }
228
229 MonoMethod*
230 mono_gc_get_managed_allocator_by_type (int atype)
231 {
232         return NULL;
233 }
234
235 guint32
236 mono_gc_get_managed_allocator_types (void)
237 {
238         return 0;
239 }
240
241 const char *
242 mono_gc_get_gc_name (void)
243 {
244         return "null";
245 }
246
247 void
248 mono_gc_add_weak_track_handle (MonoObject *obj, guint32 gchandle)
249 {
250 }
251
252 void
253 mono_gc_change_weak_track_handle (MonoObject *old_obj, MonoObject *obj, guint32 gchandle)
254 {
255 }
256
257 void
258 mono_gc_remove_weak_track_handle (guint32 gchandle)
259 {
260 }
261
262 GSList*
263 mono_gc_remove_weak_track_object (MonoDomain *domain, MonoObject *obj)
264 {
265         return NULL;
266 }
267
268 void
269 mono_gc_clear_domain (MonoDomain *domain)
270 {
271 }
272
273 int
274 mono_gc_get_suspend_signal (void)
275 {
276         return -1;
277 }
278
279 MonoMethod*
280 mono_gc_get_write_barrier (void)
281 {
282         g_assert_not_reached ();
283         return NULL;
284 }
285
286 void*
287 mono_gc_invoke_with_gc_lock (MonoGCLockedCallbackFunc func, void *data)
288 {
289         return func (data);
290 }
291
292 char*
293 mono_gc_get_description (void)
294 {
295         return g_strdup (DEFAULT_GC_NAME);
296 }
297
298 void
299 mono_gc_set_desktop_mode (void)
300 {
301 }
302
303 gboolean
304 mono_gc_is_moving (void)
305 {
306         return FALSE;
307 }
308
309 gboolean
310 mono_gc_is_disabled (void)
311 {
312         return FALSE;
313 }
314
315 void
316 mono_gc_wbarrier_value_copy_bitmap (gpointer _dest, gpointer _src, int size, unsigned bitmap)
317 {
318         g_assert_not_reached ();
319 }
320
321 guint8*
322 mono_gc_get_card_table (int *shift_bits, gpointer *card_mask)
323 {
324         g_assert_not_reached ();
325         return NULL;
326 }
327
328 gboolean
329 mono_gc_card_table_nursery_check (void)
330 {
331         g_assert_not_reached ();
332         return TRUE;
333 }
334
335 void*
336 mono_gc_get_nursery (int *shift_bits, size_t *size)
337 {
338         return NULL;
339 }
340
341 void
342 mono_gc_set_current_thread_appdomain (MonoDomain *domain)
343 {
344 }
345
346 gboolean
347 mono_gc_precise_stack_mark_enabled (void)
348 {
349         return FALSE;
350 }
351
352 FILE *
353 mono_gc_get_logfile (void)
354 {
355         return NULL;
356 }
357
358 void
359 mono_gc_conservatively_scan_area (void *start, void *end)
360 {
361         g_assert_not_reached ();
362 }
363
364 void *
365 mono_gc_scan_object (void *obj)
366 {
367         g_assert_not_reached ();
368         return NULL;
369 }
370
371 gsize*
372 mono_gc_get_bitmap_for_descr (void *descr, int *numbits)
373 {
374         g_assert_not_reached ();
375         return NULL;
376 }
377
378 void
379 mono_gc_set_gc_callbacks (MonoGCCallbacks *callbacks)
380 {
381 }
382
383 void
384 mono_gc_set_stack_end (void *stack_end)
385 {
386 }
387
388 int
389 mono_gc_get_los_limit (void)
390 {
391         return G_MAXINT;
392 }
393
394 gboolean
395 mono_gc_user_markers_supported (void)
396 {
397         return FALSE;
398 }
399
400 void *
401 mono_gc_make_root_descr_user (MonoGCRootMarkFunc marker)
402 {
403         g_assert_not_reached ();
404         return NULL;
405 }
406
407 #ifndef HOST_WIN32
408
409 int
410 mono_gc_pthread_create (pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
411 {
412         return pthread_create (new_thread, attr, start_routine, arg);
413 }
414
415 int
416 mono_gc_pthread_join (pthread_t thread, void **retval)
417 {
418         return pthread_join (thread, retval);
419 }
420
421 int
422 mono_gc_pthread_detach (pthread_t thread)
423 {
424         return pthread_detach (thread);
425 }
426
427 void
428 mono_gc_pthread_exit (void *retval)
429 {
430         pthread_exit (retval);
431 }
432
433 void mono_gc_set_skip_thread (gboolean value)
434 {
435 }
436 #endif
437
438 #ifdef HOST_WIN32
439 BOOL APIENTRY mono_gc_dllmain (HMODULE module_handle, DWORD reason, LPVOID reserved)
440 {
441         return TRUE;
442 }
443 #endif
444
445 guint
446 mono_gc_get_vtable_bits (MonoClass *class)
447 {
448         return 0;
449 }
450
451 void
452 mono_gc_register_altstack (gpointer stack, gint32 stack_size, gpointer altstack, gint32 altstack_size)
453 {
454 }
455
456 gboolean
457 mono_gc_set_allow_synchronous_major (gboolean flag)
458 {
459         return TRUE;
460 }
461
462 #endif