a609c69d86fdb5e8185662c48775eea22ce5bb87
[mono.git] / mono / sgen / gc-internal-agnostic.h
1 /*
2  * gc-internal-agnostic.h: Mono-agnostic GC interface.
3  *
4  * Copyright (C) 2015 Xamarin Inc
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License 2.0 as published by the Free Software Foundation;
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License 2.0 along with this library; if not, write to the Free
17  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19
20 #ifndef __MONO_METADATA_GCINTERNALAGNOSTIC_H__
21 #define __MONO_METADATA_GCINTERNALAGNOSTIC_H__
22
23 #include <config.h>
24 #include <glib.h>
25 #include <stdio.h>
26
27 #include "mono/utils/mono-compiler.h"
28 #include "mono/utils/parse.h"
29 #include "mono/utils/memfuncs.h"
30 #ifdef HAVE_SGEN_GC
31 #include "mono/sgen/sgen-conf.h"
32 #endif
33
34 /* h indicates whether to hide or just tag.
35  * (-!!h ^ p) is used instead of (h ? ~p : p) to avoid multiple mentions of p.
36  */
37 #define MONO_GC_HIDE_POINTER(p,t,h) ((gpointer)(((-(size_t)!!(h) ^ (size_t)(p)) & ~(size_t)3) | ((t) & (size_t)3)))
38 #define MONO_GC_REVEAL_POINTER(p,h) ((gpointer)((-(size_t)!!(h) ^ (size_t)(p)) & ~(size_t)3))
39
40 #define MONO_GC_POINTER_TAG(p) ((size_t)(p) & (size_t)3)
41
42 #define MONO_GC_HANDLE_OCCUPIED_MASK (1)
43 #define MONO_GC_HANDLE_VALID_MASK (2)
44 #define MONO_GC_HANDLE_TAG_MASK (MONO_GC_HANDLE_OCCUPIED_MASK | MONO_GC_HANDLE_VALID_MASK)
45
46 #define MONO_GC_HANDLE_METADATA_POINTER(p,h) (MONO_GC_HIDE_POINTER ((p), MONO_GC_HANDLE_OCCUPIED_MASK, (h)))
47 #define MONO_GC_HANDLE_OBJECT_POINTER(p,h) (MONO_GC_HIDE_POINTER ((p), MONO_GC_HANDLE_OCCUPIED_MASK | MONO_GC_HANDLE_VALID_MASK, (h)))
48
49 #define MONO_GC_HANDLE_OCCUPIED(slot) ((size_t)(slot) & MONO_GC_HANDLE_OCCUPIED_MASK)
50 #define MONO_GC_HANDLE_VALID(slot) ((size_t)(slot) & MONO_GC_HANDLE_VALID_MASK)
51
52 #define MONO_GC_HANDLE_TAG(slot) ((size_t)(slot) & MONO_GC_HANDLE_TAG_MASK)
53
54 #define MONO_GC_HANDLE_IS_OBJECT_POINTER(slot) (MONO_GC_HANDLE_TAG (slot) == (MONO_GC_HANDLE_OCCUPIED_MASK | MONO_GC_HANDLE_VALID_MASK))
55 #define MONO_GC_HANDLE_IS_METADATA_POINTER(slot) (MONO_GC_HANDLE_TAG (slot) == MONO_GC_HANDLE_OCCUPIED_MASK)
56
57 typedef enum {
58         HANDLE_TYPE_MIN = 0,
59         HANDLE_WEAK = HANDLE_TYPE_MIN,
60         HANDLE_WEAK_TRACK,
61         HANDLE_NORMAL,
62         HANDLE_PINNED,
63         HANDLE_TYPE_MAX
64 } GCHandleType;
65
66 #define GC_HANDLE_TYPE_IS_WEAK(x) ((x) <= HANDLE_WEAK_TRACK)
67
68 #define MONO_GC_HANDLE_TYPE_SHIFT (3)
69 #define MONO_GC_HANDLE_TYPE_MASK ((1 << MONO_GC_HANDLE_TYPE_SHIFT) - 1)
70 #define MONO_GC_HANDLE_TYPE(x) ((GCHandleType)(((x) & MONO_GC_HANDLE_TYPE_MASK) - 1))
71 #define MONO_GC_HANDLE_SLOT(x) ((x) >> MONO_GC_HANDLE_TYPE_SHIFT)
72 #define MONO_GC_HANDLE_TYPE_IS_WEAK(x) ((x) <= HANDLE_WEAK_TRACK)
73 #define MONO_GC_HANDLE(slot, type) (((slot) << MONO_GC_HANDLE_TYPE_SHIFT) | (((type) & MONO_GC_HANDLE_TYPE_MASK) + 1))
74
75 typedef struct {
76         guint minor_gc_count;
77         guint major_gc_count;
78         guint64 minor_gc_time;
79         guint64 major_gc_time;
80         guint64 major_gc_time_concurrent;
81 } GCStats;
82
83 extern GCStats gc_stats;
84
85 #ifdef HAVE_SGEN_GC
86 typedef SgenDescriptor MonoGCDescriptor;
87 #define MONO_GC_DESCRIPTOR_NULL SGEN_DESCRIPTOR_NULL
88 #else
89 typedef void* MonoGCDescriptor;
90 #define MONO_GC_DESCRIPTOR_NULL NULL
91 #endif
92
93 /*
94  * Try to register a foreign thread with the GC, if we fail or the backend
95  * can't cope with this concept - we return FALSE.
96  */
97 extern gboolean mono_gc_register_thread (void *baseptr);
98
99 gboolean mono_gc_parse_environment_string_extract_number (const char *str, size_t *out);
100
101 MonoGCDescriptor mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size);
102 MonoGCDescriptor mono_gc_make_descr_for_array (int vector, gsize *elem_bitmap, int numbits, size_t elem_size);
103
104 /* simple interface for data structures needed in the runtime */
105 MonoGCDescriptor mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits);
106
107 /* Return a root descriptor for a root with all refs */
108 MonoGCDescriptor mono_gc_make_root_descr_all_refs (int numbits);
109
110 /* Return the bitmap encoded by a descriptor */
111 gsize* mono_gc_get_bitmap_for_descr (MonoGCDescriptor descr, int *numbits);
112
113 /*
114 These functions must be used when it's possible that either destination is not
115 word aligned or size is not a multiple of word size.
116 */
117 void mono_gc_bzero_atomic (void *dest, size_t size);
118 void mono_gc_bzero_aligned (void *dest, size_t size);
119 void mono_gc_memmove_atomic (void *dest, const void *src, size_t size);
120 void mono_gc_memmove_aligned (void *dest, const void *src, size_t size);
121
122 FILE *mono_gc_get_logfile (void);
123
124 #endif