[mini] Use C++ linker iff building C++ that needs the C++ runtime (#12266)
[mono-project.git] / mono / metadata / null-gc.c
blobb530f79c214e0c6eea752630f543699a4f8b4535
1 /**
2 * \file
3 * GC implementation using malloc: will leak everything, just for testing.
5 * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
6 * Copyright 2004-2011 Novell, Inc (http://www.novell.com)
7 * Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
8 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
9 */
11 #include "config.h"
12 #include <glib.h>
13 #include <mono/metadata/mono-gc.h>
14 #include <mono/metadata/gc-internals.h>
15 #include <mono/metadata/runtime.h>
16 #include <mono/metadata/w32handle.h>
17 #include <mono/metadata/abi-details.h>
18 #include <mono/utils/atomic.h>
19 #include <mono/utils/mono-threads.h>
20 #include <mono/utils/mono-counters.h>
21 #include <mono/metadata/null-gc-handles.h>
23 #ifdef HAVE_NULL_GC
25 static gboolean gc_inited = FALSE;
27 void
28 mono_gc_base_init (void)
30 if (gc_inited)
31 return;
33 mono_counters_init ();
35 #ifndef HOST_WIN32
36 mono_w32handle_init ();
37 #endif
39 mono_thread_callbacks_init ();
40 mono_thread_info_init (sizeof (MonoThreadInfo));
42 mono_thread_info_attach ();
44 null_gc_handles_init ();
46 gc_inited = TRUE;
49 void
50 mono_gc_base_cleanup (void)
54 void
55 mono_gc_collect (int generation)
59 int
60 mono_gc_max_generation (void)
62 return 0;
65 int
66 mono_gc_get_generation (MonoObject *object)
68 return 0;
71 int
72 mono_gc_collection_count (int generation)
74 return 0;
77 void
78 mono_gc_add_memory_pressure (gint64 value)
82 /* maybe track the size, not important, though */
83 int64_t
84 mono_gc_get_used_size (void)
86 return 1024*1024;
89 int64_t
90 mono_gc_get_heap_size (void)
92 return 2*1024*1024;
95 gboolean
96 mono_gc_is_gc_thread (void)
98 return TRUE;
102 mono_gc_walk_heap (int flags, MonoGCReferences callback, void *data)
104 return 1;
107 gboolean
108 mono_object_is_alive (MonoObject* o)
110 return TRUE;
114 mono_gc_register_root (char *start, size_t size, void *descr, MonoGCRootSource source, void *key, const char *msg)
116 return TRUE;
120 mono_gc_register_root_wbarrier (char *start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg)
122 return TRUE;
126 void
127 mono_gc_deregister_root (char* addr)
131 void*
132 mono_gc_make_descr_for_string (gsize *bitmap, int numbits)
134 return NULL;
137 void*
138 mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size)
140 return NULL;
143 void*
144 mono_gc_make_descr_for_array (int vector, gsize *elem_bitmap, int numbits, size_t elem_size)
146 return NULL;
149 void*
150 mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
152 return NULL;
155 void*
156 mono_gc_make_vector_descr (void)
158 return NULL;
161 void*
162 mono_gc_make_root_descr_all_refs (int numbits)
164 return NULL;
167 MonoObject*
168 mono_gc_alloc_fixed (size_t size, void *descr, MonoGCRootSource source, void *key, const char *msg)
170 return (MonoObject*)g_malloc0 (size);
173 MonoObject*
174 mono_gc_alloc_fixed_no_descriptor (size_t size, MonoGCRootSource source, void *key, const char *msg)
176 return mono_gc_alloc_fixed (size, NULL, source, key, msg);
179 void
180 mono_gc_free_fixed (void* addr)
182 g_free (addr);
185 MonoObject*
186 mono_gc_alloc_obj (MonoVTable *vtable, size_t size)
188 MonoObject *obj = g_calloc (1, size);
190 obj->vtable = vtable;
192 return obj;
195 MonoArray*
196 mono_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length)
198 MonoArray *obj = g_calloc (1, size);
200 obj->obj.vtable = vtable;
201 obj->max_length = max_length;
203 return obj;
206 MonoArray*
207 mono_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uintptr_t bounds_size)
209 MonoArray *obj = g_calloc (1, size);
211 obj->obj.vtable = vtable;
212 obj->max_length = max_length;
214 if (bounds_size)
215 obj->bounds = (MonoArrayBounds *) ((char *) obj + size - bounds_size);
217 return obj;
220 MonoString*
221 mono_gc_alloc_string (MonoVTable *vtable, size_t size, gint32 len)
223 MonoString *obj = g_calloc (1, size);
225 obj->object.vtable = vtable;
226 obj->length = len;
227 obj->chars [len] = 0;
229 return obj;
232 MonoObject*
233 mono_gc_alloc_mature (MonoVTable *vtable, size_t size)
235 return mono_gc_alloc_obj (vtable, size);
238 MonoObject*
239 mono_gc_alloc_pinned_obj (MonoVTable *vtable, size_t size)
241 return mono_gc_alloc_obj (vtable, size);
244 void
245 mono_gc_wbarrier_set_field_internal (MonoObject *obj, gpointer field_ptr, MonoObject* value)
247 *(void**)field_ptr = value;
250 void
251 mono_gc_wbarrier_set_arrayref_internal (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
253 *(void**)slot_ptr = value;
256 void
257 mono_gc_wbarrier_arrayref_copy_internal (gpointer dest_ptr, gpointer src_ptr, int count)
259 mono_gc_memmove_aligned (dest_ptr, src_ptr, count * sizeof (gpointer));
262 void
263 mono_gc_wbarrier_generic_store_internal (gpointer ptr, MonoObject* value)
265 *(void**)ptr = value;
268 void
269 mono_gc_wbarrier_generic_store_atomic_internal (gpointer ptr, MonoObject *value)
271 mono_atomic_store_ptr (ptr, value);
274 void
275 mono_gc_wbarrier_generic_nostore_internal (gpointer ptr)
279 void
280 mono_gc_wbarrier_value_copy_internal (gpointer dest, gpointer src, int count, MonoClass *klass)
282 mono_gc_memmove_atomic (dest, src, count * mono_class_value_size (klass, NULL));
285 void
286 mono_gc_wbarrier_object_copy_internal (MonoObject* obj, MonoObject *src)
288 /* do not copy the sync state */
289 mono_gc_memmove_aligned (mono_object_get_data (obj), (char*)src + MONO_ABI_SIZEOF (MonoObject),
290 mono_object_class (obj)->instance_size - MONO_ABI_SIZEOF (MonoObject));
293 gboolean
294 mono_gc_is_critical_method (MonoMethod *method)
296 return FALSE;
299 gpointer
300 mono_gc_thread_attach (MonoThreadInfo* info)
302 info->handle_stack = mono_handle_stack_alloc ();
303 return info;
306 void
307 mono_gc_thread_detach_with_lock (MonoThreadInfo *p)
309 mono_handle_stack_free (p->handle_stack);
312 gboolean
313 mono_gc_thread_in_critical_region (MonoThreadInfo *info)
315 return FALSE;
319 mono_gc_get_aligned_size_for_allocator (int size)
321 return size;
324 MonoMethod*
325 mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size)
327 return NULL;
330 MonoMethod*
331 mono_gc_get_managed_array_allocator (MonoClass *klass)
333 return NULL;
336 MonoMethod*
337 mono_gc_get_managed_allocator_by_type (int atype, ManagedAllocatorVariant variant)
339 return NULL;
342 guint32
343 mono_gc_get_managed_allocator_types (void)
345 return 0;
348 const char *
349 mono_gc_get_gc_name (void)
351 return "null";
354 void
355 mono_gc_clear_domain (MonoDomain *domain)
359 void
360 mono_gc_suspend_finalizers (void)
365 mono_gc_get_suspend_signal (void)
367 return -1;
371 mono_gc_get_restart_signal (void)
373 return -1;
376 MonoMethod*
377 mono_gc_get_specific_write_barrier (gboolean is_concurrent)
379 g_assert_not_reached ();
380 return NULL;
383 MonoMethod*
384 mono_gc_get_write_barrier (void)
386 g_assert_not_reached ();
387 return NULL;
390 void*
391 mono_gc_invoke_with_gc_lock (MonoGCLockedCallbackFunc func, void *data)
393 return func (data);
396 char*
397 mono_gc_get_description (void)
399 return g_strdup (DEFAULT_GC_NAME);
402 void
403 mono_gc_set_desktop_mode (void)
407 gboolean
408 mono_gc_is_moving (void)
410 return FALSE;
413 gboolean
414 mono_gc_is_disabled (void)
416 return FALSE;
419 void
420 mono_gc_wbarrier_range_copy (gpointer _dest, gconstpointer _src, int size)
422 g_assert_not_reached ();
425 MonoRangeCopyFunction
426 mono_gc_get_range_copy_func (void)
428 return &mono_gc_wbarrier_range_copy;
431 guint8*
432 mono_gc_get_card_table (int *shift_bits, gpointer *card_mask)
434 g_assert_not_reached ();
435 return NULL;
438 guint8*
439 mono_gc_get_target_card_table (int *shift_bits, target_mgreg_t *card_mask)
441 *shift_bits = 0;
442 *card_mask = 0;
443 return NULL;
446 gboolean
447 mono_gc_card_table_nursery_check (void)
449 g_assert_not_reached ();
450 return TRUE;
453 void*
454 mono_gc_get_nursery (int *shift_bits, size_t *size)
456 return NULL;
459 gboolean
460 mono_gc_precise_stack_mark_enabled (void)
462 return FALSE;
465 FILE *
466 mono_gc_get_logfile (void)
468 return NULL;
471 void
472 mono_gc_params_set (const char* options)
476 void
477 mono_gc_debug_set (const char* options)
481 void
482 mono_gc_conservatively_scan_area (void *start, void *end)
484 g_assert_not_reached ();
487 void *
488 mono_gc_scan_object (void *obj, void *gc_data)
490 g_assert_not_reached ();
491 return NULL;
494 gsize*
495 mono_gc_get_bitmap_for_descr (void *descr, int *numbits)
497 g_assert_not_reached ();
498 return NULL;
501 void
502 mono_gc_set_gc_callbacks (MonoGCCallbacks *callbacks)
506 void
507 mono_gc_set_stack_end (void *stack_end)
512 mono_gc_get_los_limit (void)
514 return G_MAXINT;
517 gboolean
518 mono_gc_user_markers_supported (void)
520 return FALSE;
523 void *
524 mono_gc_make_root_descr_user (MonoGCRootMarkFunc marker)
526 g_assert_not_reached ();
527 return NULL;
530 #ifndef HOST_WIN32
532 mono_gc_pthread_create (pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
534 return pthread_create (new_thread, attr, start_routine, arg);
536 #endif
538 void
539 mono_gc_skip_thread_changing (gboolean skip)
541 // No STW, nothing needs to be done.
544 void
545 mono_gc_skip_thread_changed (gboolean skip)
549 #ifdef HOST_WIN32
550 BOOL APIENTRY mono_gc_dllmain (HMODULE module_handle, DWORD reason, LPVOID reserved)
552 return TRUE;
554 #endif
556 MonoVTable *
557 mono_gc_get_vtable (MonoObject *obj)
559 // No pointer tagging.
560 return obj->vtable;
563 guint
564 mono_gc_get_vtable_bits (MonoClass *klass)
566 return 0;
569 void
570 mono_gc_register_altstack (gpointer stack, gint32 stack_size, gpointer altstack, gint32 altstack_size)
574 gboolean
575 mono_gc_is_null (void)
577 return TRUE;
581 mono_gc_invoke_finalizers (void)
583 return 0;
586 MonoBoolean
587 mono_gc_pending_finalizers (void)
589 return FALSE;
592 gboolean
593 mono_gc_ephemeron_array_add (MonoObject *obj)
595 return TRUE;
598 #else
600 MONO_EMPTY_SOURCE_FILE (null_gc);
601 #endif /* HAVE_NULL_GC */