Pass the --clr-memory-model flag on the command line instead of MONO_DEBUG so its...
[mono-project.git] / mono / metadata / gc-internals.h
blob9adc9710201ce6369cdb50c12e7edf49fe3d7996
1 /**
2 * \file
3 * Internal GC interface
5 * Author: Paolo Molaro <lupus@ximian.com>
7 * (C) 2002 Ximian, Inc.
8 * Copyright 2012 Xamarin Inc (http://www.xamarin.com)
9 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
12 #ifndef __MONO_METADATA_GC_INTERNAL_H__
13 #define __MONO_METADATA_GC_INTERNAL_H__
15 #include <glib.h>
16 #include <mono/utils/gc_wrapper.h>
17 #include <mono/metadata/object-internals.h>
18 #include <mono/metadata/threads-types.h>
19 #include <mono/sgen/gc-internal-agnostic.h>
20 #include <mono/metadata/icalls.h>
22 #define mono_domain_finalizers_lock(domain) mono_os_mutex_lock (&(domain)->finalizable_objects_hash_lock);
23 #define mono_domain_finalizers_unlock(domain) mono_os_mutex_unlock (&(domain)->finalizable_objects_hash_lock);
25 /* Register a memory area as a conservatively scanned GC root */
26 #define MONO_GC_REGISTER_ROOT_PINNING(x,src,key,msg) mono_gc_register_root ((char*)&(x), sizeof(x), MONO_GC_DESCRIPTOR_NULL, (src), (key), (msg))
28 #define MONO_GC_UNREGISTER_ROOT(x) mono_gc_deregister_root ((char*)&(x))
31 * Return a GC descriptor for an array containing N pointers to memory allocated
32 * by mono_gc_alloc_fixed ().
34 /* For SGEN, the result of alloc_fixed () is not GC tracked memory */
35 #define MONO_GC_ROOT_DESCR_FOR_FIXED(n) (mono_gc_is_moving () ? mono_gc_make_root_descr_all_refs (0) : MONO_GC_DESCRIPTOR_NULL)
37 /* Register a memory location holding a single object reference as a GC root */
38 #define MONO_GC_REGISTER_ROOT_SINGLE(x,src,key,msg) do { \
39 g_assert (sizeof (x) == sizeof (MonoObject*)); \
40 mono_gc_register_root ((char*)&(x), sizeof(MonoObject*), mono_gc_make_root_descr_all_refs (1), (src), (key),(msg)); \
41 } while (0)
44 * This is used for fields which point to objects which are kept alive by other references
45 * when using Boehm.
47 #define MONO_GC_REGISTER_ROOT_IF_MOVING(x,src,key,msg) do { \
48 if (mono_gc_is_moving ()) \
49 MONO_GC_REGISTER_ROOT_SINGLE(x,src,key,msg); \
50 } while (0)
52 #define MONO_GC_UNREGISTER_ROOT_IF_MOVING(x) do { \
53 if (mono_gc_is_moving ()) \
54 MONO_GC_UNREGISTER_ROOT (x); \
55 } while (0)
57 /* useful until we keep track of gc-references in corlib etc. */
58 #define IS_GC_REFERENCE(class,t) (mono_gc_is_moving () ? FALSE : ((t)->type == MONO_TYPE_U && (class)->image == mono_defaults.corlib))
60 void mono_object_register_finalizer (MonoObject *obj);
62 void
63 mono_object_register_finalizer_handle (MonoObjectHandle obj);
65 extern void mono_gc_init (void);
66 extern void mono_gc_base_init (void);
67 extern void mono_gc_cleanup (void);
68 extern void mono_gc_base_cleanup (void);
69 extern void mono_gc_init_icalls (void);
72 * Return whenever the current thread is registered with the GC (i.e. started
73 * by the GC pthread wrappers on unix.
75 extern gboolean mono_gc_is_gc_thread (void);
77 extern gboolean mono_gc_is_finalizer_internal_thread (MonoInternalThread *thread);
79 extern void mono_gc_set_stack_end (void *stack_end);
81 /* only valid after the RECLAIM_START GC event and before RECLAIM_END
82 * Not exported in public headers, but can be linked to (unsupported).
84 gboolean mono_object_is_alive (MonoObject* obj);
85 gboolean mono_gc_is_finalizer_thread (MonoThread *thread);
87 void mono_gchandle_set_target (guint32 gchandle, MonoObject *obj);
89 /*Ephemeron functionality. Sgen only*/
90 gboolean mono_gc_ephemeron_array_add (MonoObject *obj);
92 /* User defined marking function */
93 /* It should work like this:
94 * foreach (ref in GC references in the are structure pointed to by ADDR)
95 * mark_func (ref)
97 typedef void (*MonoGCMarkFunc) (MonoObject **addr, void *gc_data);
98 typedef void (*MonoGCRootMarkFunc) (void *addr, MonoGCMarkFunc mark_func, void *gc_data);
100 /* Create a descriptor with a user defined marking function */
101 MonoGCDescriptor mono_gc_make_root_descr_user (MonoGCRootMarkFunc marker);
103 /* Return whenever user defined marking functions are supported */
104 gboolean mono_gc_user_markers_supported (void);
106 /* desc is the result from mono_gc_make_descr*. A NULL value means
107 * all the words might contain GC pointers.
108 * The memory is non-moving and it will be explicitly deallocated.
109 * size bytes will be available from the returned address (ie, descr
110 * must not be stored in the returned memory)
112 MonoObject* mono_gc_alloc_fixed (size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg);
114 // C++ callers outside of metadata (mini/tasklets.c) must use mono_gc_alloc_fixed_no_descriptor
115 // instead of mono_gc_alloc_fixed, or else compile twice -- boehm and sgen.
116 MonoObject*
117 mono_gc_alloc_fixed_no_descriptor (size_t size, MonoGCRootSource source, void *key, const char *msg);
119 void mono_gc_free_fixed (void* addr);
121 /* make sure the gchandle was allocated for an object in domain */
122 gboolean mono_gchandle_is_in_domain (guint32 gchandle, MonoDomain *domain);
123 void mono_gchandle_free_domain (MonoDomain *domain);
125 typedef void (*FinalizerThreadCallback) (gpointer user_data);
127 MonoObject*
128 mono_gc_alloc_pinned_obj (MonoVTable *vtable, size_t size);
130 MonoObjectHandle
131 mono_gc_alloc_handle_pinned_obj (MonoVTable *vtable, gsize size);
133 MonoObject*
134 mono_gc_alloc_obj (MonoVTable *vtable, size_t size);
136 MonoObjectHandle
137 mono_gc_alloc_handle_obj (MonoVTable *vtable, gsize size);
139 MonoArray*
140 mono_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length);
142 MonoArrayHandle
143 mono_gc_alloc_handle_vector (MonoVTable *vtable, gsize size, gsize max_length);
145 MonoArray*
146 mono_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uintptr_t bounds_size);
148 MonoArrayHandle
149 mono_gc_alloc_handle_array (MonoVTable *vtable, gsize size, gsize max_length, gsize bounds_size);
151 MonoString*
152 mono_gc_alloc_string (MonoVTable *vtable, size_t size, gint32 len);
154 MonoStringHandle
155 mono_gc_alloc_handle_string (MonoVTable *vtable, gsize size, gint32 len);
157 MonoObject*
158 mono_gc_alloc_mature (MonoVTable *vtable, size_t size);
160 MonoGCDescriptor mono_gc_make_descr_for_string (gsize *bitmap, int numbits);
162 MonoObjectHandle
163 mono_gc_alloc_handle_mature (MonoVTable *vtable, gsize size);
165 void mono_gc_register_obj_with_weak_fields (void *obj);
166 void
167 mono_gc_register_object_with_weak_fields (MonoObjectHandle obj);
169 typedef void (*MonoFinalizationProc)(gpointer, gpointer); // same as SGenFinalizationProc, GC_finalization_proc
171 void mono_gc_register_for_finalization (MonoObject *obj, MonoFinalizationProc user_data);
172 void mono_gc_add_memory_pressure (gint64 value);
173 MONO_API int mono_gc_register_root (char *start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg);
174 void mono_gc_deregister_root (char* addr);
175 void mono_gc_finalize_domain (MonoDomain *domain);
176 void mono_gc_run_finalize (void *obj, void *data);
177 void mono_gc_clear_domain (MonoDomain * domain);
178 /* Signal early termination of finalizer processing inside the gc */
179 void mono_gc_suspend_finalizers (void);
183 * Register a root which can only be written using a write barrier.
184 * Writes to the root must be done using a write barrier (MONO_ROOT_SETREF).
185 * If the root uses an user defined mark routine, the writes are not required to be
186 * to the area between START and START+SIZE.
187 * The write barrier allows the GC to avoid scanning this root at each collection, so it
188 * is more efficient.
189 * FIXME: Add an API for clearing remset entries if a root with a user defined
190 * mark routine is deleted.
192 int mono_gc_register_root_wbarrier (char *start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg);
194 void mono_gc_wbarrier_set_root (gpointer ptr, MonoObject *value);
196 /* Set a field of a root registered using mono_gc_register_root_wbarrier () */
197 #define MONO_ROOT_SETREF(s,fieldname,value) do { \
198 mono_gc_wbarrier_set_root (&((s)->fieldname), (MonoObject*)value); \
199 } while (0)
201 /* fast allocation support */
203 typedef enum {
204 // Regular fast path allocator.
205 MANAGED_ALLOCATOR_REGULAR,
206 // Managed allocator that just calls into the runtime.
207 MANAGED_ALLOCATOR_SLOW_PATH,
208 // Managed allocator that works like the regular one but also calls into the profiler.
209 MANAGED_ALLOCATOR_PROFILER,
210 } ManagedAllocatorVariant;
212 int mono_gc_get_aligned_size_for_allocator (int size);
213 MonoMethod* mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size);
214 MonoMethod* mono_gc_get_managed_array_allocator (MonoClass *klass);
215 MonoMethod *mono_gc_get_managed_allocator_by_type (int atype, ManagedAllocatorVariant variant);
217 guint32 mono_gc_get_managed_allocator_types (void);
219 /* Return a short string identifying the GC, indented to be saved in AOT images */
220 const char *mono_gc_get_gc_name (void);
222 /* Fast write barriers */
223 MonoMethod* mono_gc_get_specific_write_barrier (gboolean is_concurrent);
224 MonoMethod* mono_gc_get_write_barrier (void);
226 /* Fast valuetype copy */
227 /* WARNING: [dest, dest + size] must be within the bounds of a single type, otherwise the GC will lose remset entries */
228 G_EXTERN_C void mono_gc_wbarrier_range_copy (gpointer dest, gconstpointer src, int size);
230 typedef void (*MonoRangeCopyFunction)(gpointer, gconstpointer, int size);
232 MonoRangeCopyFunction
233 mono_gc_get_range_copy_func (void);
236 * Functions supplied by the runtime and called by the GC. Currently only used
237 * by SGEN.
239 typedef struct {
241 * Function called during thread startup/attach to allocate thread-local data
242 * needed by the other functions.
244 gpointer (*thread_attach_func) (void);
246 * Function called during thread deatch to free the data allocated by
247 * thread_attach_func.
249 void (*thread_detach_func) (gpointer user_data);
251 * Function called from every thread when suspending for GC. It can save
252 * data needed for marking from thread stacks. user_data is the data returned
253 * by attach_func. This might called with GC locks held and the word stopped,
254 * so it shouldn't do any synchronization etc.
256 void (*thread_suspend_func) (gpointer user_data, void *sigcontext, MonoContext *ctx);
258 * Function called to mark from thread stacks. user_data is the data returned
259 * by attach_func. This is called twice, with the word stopped:
260 * - in the first pass, it should mark areas of the stack using
261 * conservative marking by calling mono_gc_conservatively_scan_area ().
262 * - in the second pass, it should mark the remaining areas of the stack
263 * using precise marking by calling mono_gc_scan_object ().
265 void (*thread_mark_func) (gpointer user_data, guint8 *stack_start, guint8 *stack_end, gboolean precise, void *gc_data);
267 * Function called for debugging to get the current managed method for
268 * tracking the provenances of objects.
270 gpointer (*get_provenance_func) (void);
271 } MonoGCCallbacks;
273 /* Set the callback functions callable by the GC */
274 void mono_gc_set_gc_callbacks (MonoGCCallbacks *callbacks);
275 MonoGCCallbacks *mono_gc_get_gc_callbacks (void);
277 /* Functions callable from the thread mark func */
279 /* Scan the memory area between START and END conservatively */
280 void mono_gc_conservatively_scan_area (void *start, void *end);
282 /* Scan OBJ, returning its new address */
283 void *mono_gc_scan_object (void *obj, void *gc_data);
285 /* Return the suspend signal number used by the GC to suspend threads,
286 or -1 if not applicable. */
287 int mono_gc_get_suspend_signal (void);
289 /* Return the suspend signal number used by the GC to suspend threads,
290 or -1 if not applicable. */
291 int mono_gc_get_restart_signal (void);
294 * Return a human readable description of the GC in malloc-ed memory.
296 char* mono_gc_get_description (void);
299 * Configure the GC to desktop mode
301 void mono_gc_set_desktop_mode (void);
304 * Return whenever this GC can move objects
306 gboolean mono_gc_is_moving (void);
308 typedef void* (*MonoGCLockedCallbackFunc) (void *data);
310 void* mono_gc_invoke_with_gc_lock (MonoGCLockedCallbackFunc func, void *data);
312 int mono_gc_get_los_limit (void);
314 guint64 mono_gc_get_allocated_bytes_for_current_thread (void);
316 guint8* mono_gc_get_card_table (int *shift_bits, gpointer *card_mask);
317 guint8* mono_gc_get_target_card_table (int *shift_bits, target_mgreg_t *card_mask);
318 gboolean mono_gc_card_table_nursery_check (void);
320 void* mono_gc_get_nursery (int *shift_bits, size_t *size);
322 // Don't use directly; set/unset MONO_THREAD_INFO_FLAGS_NO_GC instead.
323 void mono_gc_skip_thread_changing (gboolean skip);
324 void mono_gc_skip_thread_changed (gboolean skip);
326 #ifndef HOST_WIN32
327 int mono_gc_pthread_create (pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
328 #endif
331 * Return whenever GC is disabled
333 gboolean mono_gc_is_disabled (void);
336 * Return whenever this is the null GC
338 gboolean mono_gc_is_null (void);
340 void mono_gc_set_string_length (MonoString *str, gint32 new_length);
342 #if defined(__MACH__)
343 void mono_gc_register_mach_exception_thread (pthread_t thread);
344 pthread_t mono_gc_get_mach_exception_thread (void);
345 #endif
347 gboolean mono_gc_precise_stack_mark_enabled (void);
349 typedef struct _RefQueueEntry RefQueueEntry;
351 struct _RefQueueEntry {
352 void *dis_link;
353 guint32 gchandle;
354 MonoDomain *domain;
355 void *user_data;
356 RefQueueEntry *next;
359 struct _MonoReferenceQueue {
360 RefQueueEntry *queue;
361 mono_reference_queue_callback callback;
362 MonoReferenceQueue *next;
363 gboolean should_be_deleted;
366 enum {
367 MONO_GC_FINALIZER_EXTENSION_VERSION = 1,
370 typedef struct {
371 int version;
372 gboolean (*is_class_finalization_aware) (MonoClass *klass);
373 void (*object_queued_for_finalization) (MonoObject *object);
374 } MonoGCFinalizerCallbacks;
376 MONO_API void mono_gc_register_finalizer_callbacks (MonoGCFinalizerCallbacks *callbacks);
379 #ifdef HOST_WIN32
380 BOOL APIENTRY mono_gc_dllmain (HMODULE module_handle, DWORD reason, LPVOID reserved);
381 #endif
383 MonoVTable *mono_gc_get_vtable (MonoObject *obj);
385 guint mono_gc_get_vtable_bits (MonoClass *klass);
387 void mono_gc_register_altstack (gpointer stack, gint32 stack_size, gpointer altstack, gint32 altstack_size);
389 gboolean mono_gc_is_critical_method (MonoMethod *method);
391 G_EXTERN_C // due to THREAD_INFO_TYPE varying
392 gpointer mono_gc_thread_attach (THREAD_INFO_TYPE *info);
394 G_EXTERN_C // due to THREAD_INFO_TYPE varying
395 void mono_gc_thread_detach_with_lock (THREAD_INFO_TYPE *info);
397 G_EXTERN_C // due to THREAD_INFO_TYPE varying
398 gboolean mono_gc_thread_in_critical_region (THREAD_INFO_TYPE *info);
400 /* If set, print debugging messages around finalizers. */
401 extern gboolean mono_log_finalizers;
403 /* If set, do not run finalizers. */
404 extern gboolean mono_do_not_finalize;
405 /* List of names of classes not to finalize. */
406 extern gchar **mono_do_not_finalize_class_names;
408 #endif /* __MONO_METADATA_GC_INTERNAL_H__ */