少年修仙传客户端基础资源
hch
2024-04-01 d01413b00ef631ac20347716b23818b0b811f65f
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
/**
 * \file
 * Internal GC interface
 *
 * Author: Paolo Molaro <lupus@ximian.com>
 *
 * (C) 2002 Ximian, Inc.
 * Copyright 2012 Xamarin Inc (http://www.xamarin.com)
 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
 */
 
#ifndef __MONO_METADATA_GC_INTERNAL_H__
#define __MONO_METADATA_GC_INTERNAL_H__
 
#include <glib.h>
#include <mono/utils/gc_wrapper.h>
#include <mono/metadata/object-internals.h>
#include <mono/metadata/threads-types.h>
#include <mono/sgen/gc-internal-agnostic.h>
 
#define mono_domain_finalizers_lock(domain) mono_os_mutex_lock (&(domain)->finalizable_objects_hash_lock);
#define mono_domain_finalizers_unlock(domain) mono_os_mutex_unlock (&(domain)->finalizable_objects_hash_lock);
 
/* Register a memory area as a conservatively scanned GC root */
#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))
 
#define MONO_GC_UNREGISTER_ROOT(x) mono_gc_deregister_root ((char*)&(x))
 
/*
 * Return a GC descriptor for an array containing N pointers to memory allocated
 * by mono_gc_alloc_fixed ().
 */
/* For SGEN, the result of alloc_fixed () is not GC tracked memory */
#define MONO_GC_ROOT_DESCR_FOR_FIXED(n) (mono_gc_is_moving () ? mono_gc_make_root_descr_all_refs (0) : MONO_GC_DESCRIPTOR_NULL)
 
/* Register a memory location holding a single object reference as a GC root */
#define MONO_GC_REGISTER_ROOT_SINGLE(x,src,key,msg) do { \
    g_assert (sizeof (x) == sizeof (MonoObject*)); \
    mono_gc_register_root ((char*)&(x), sizeof(MonoObject*), mono_gc_make_root_descr_all_refs (1), (src), (key),(msg)); \
    } while (0)
 
/*
 * This is used for fields which point to objects which are kept alive by other references
 * when using Boehm.
 */
#define MONO_GC_REGISTER_ROOT_IF_MOVING(x,src,key,msg) do { \
    if (mono_gc_is_moving ()) \
        MONO_GC_REGISTER_ROOT_SINGLE(x,src,key,msg);        \
} while (0)
 
#define MONO_GC_UNREGISTER_ROOT_IF_MOVING(x) do { \
    if (mono_gc_is_moving ()) \
        MONO_GC_UNREGISTER_ROOT (x);            \
} while (0)
 
/* useful until we keep track of gc-references in corlib etc. */
#define IS_GC_REFERENCE(class,t) (mono_gc_is_moving () ? FALSE : ((t)->type == MONO_TYPE_U && (class)->image == mono_defaults.corlib))
 
void   mono_object_register_finalizer               (MonoObject  *obj);
void   ves_icall_System_GC_InternalCollect          (int          generation);
gint64 ves_icall_System_GC_GetTotalMemory           (MonoBoolean  forceCollection);
void   ves_icall_System_GC_KeepAlive                (MonoObject  *obj);
void   ves_icall_System_GC_ReRegisterForFinalize    (MonoObject  *obj);
void   ves_icall_System_GC_SuppressFinalize         (MonoObject  *obj);
void   ves_icall_System_GC_WaitForPendingFinalizers (void);
 
MonoObject *ves_icall_System_GCHandle_GetTarget (guint32 handle);
guint32     ves_icall_System_GCHandle_GetTargetHandle (MonoObject *obj, guint32 handle, gint32 type);
void        ves_icall_System_GCHandle_FreeHandle (guint32 handle);
gpointer    ves_icall_System_GCHandle_GetAddrOfPinnedObject (guint32 handle);
void        ves_icall_System_GC_register_ephemeron_array (MonoObject *array);
MonoObject  *ves_icall_System_GC_get_ephemeron_tombstone (void);
 
 
extern void mono_gc_init (void);
extern void mono_gc_base_init (void);
extern void mono_gc_cleanup (void);
extern void mono_gc_base_cleanup (void);
 
/*
 * Return whenever the current thread is registered with the GC (i.e. started
 * by the GC pthread wrappers on unix.
 */
extern gboolean mono_gc_is_gc_thread (void);
 
extern gboolean mono_gc_is_finalizer_internal_thread (MonoInternalThread *thread);
 
extern void mono_gc_set_stack_end (void *stack_end);
 
/* only valid after the RECLAIM_START GC event and before RECLAIM_END
 * Not exported in public headers, but can be linked to (unsupported).
 */
MONO_API gboolean mono_object_is_alive (MonoObject* obj);
gboolean mono_gc_is_finalizer_thread (MonoThread *thread);
 
void mono_gchandle_set_target (guint32 gchandle, MonoObject *obj);
 
/*Ephemeron functionality. Sgen only*/
gboolean    mono_gc_ephemeron_array_add (MonoObject *obj);
 
MonoBoolean
mono_gc_GCHandle_CheckCurrentDomain (guint32 gchandle);
 
/* User defined marking function */
/* It should work like this:
 * foreach (ref in GC references in the are structure pointed to by ADDR)
 *    mark_func (ref)
 */
typedef void (*MonoGCMarkFunc)     (MonoObject **addr, void *gc_data);
typedef void (*MonoGCRootMarkFunc) (void *addr, MonoGCMarkFunc mark_func, void *gc_data);
 
/* Create a descriptor with a user defined marking function */
MonoGCDescriptor mono_gc_make_root_descr_user (MonoGCRootMarkFunc marker);
 
/* Return whenever user defined marking functions are supported */
gboolean mono_gc_user_markers_supported (void);
 
/* desc is the result from mono_gc_make_descr*. A NULL value means
 * all the words might contain GC pointers.
 * The memory is non-moving and it will be explicitly deallocated.
 * size bytes will be available from the returned address (ie, descr
 * must not be stored in the returned memory)
 */
void* mono_gc_alloc_fixed            (size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg);
void  mono_gc_free_fixed             (void* addr);
 
/* make sure the gchandle was allocated for an object in domain */
UNITY_MONO_API gboolean mono_gchandle_is_in_domain (guint32 gchandle, MonoDomain *domain);
void     mono_gchandle_free_domain  (MonoDomain *domain);
 
typedef void (*FinalizerThreadCallback) (gpointer user_data);
 
void* mono_gc_alloc_pinned_obj (MonoVTable *vtable, size_t size);
void* mono_gc_alloc_obj (MonoVTable *vtable, size_t size);
void* mono_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length);
void* mono_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uintptr_t bounds_size);
void* mono_gc_alloc_string (MonoVTable *vtable, size_t size, gint32 len);
void* mono_gc_alloc_mature (MonoVTable *vtable, size_t size);
MonoGCDescriptor mono_gc_make_descr_for_string (gsize *bitmap, int numbits);
 
void mono_gc_register_obj_with_weak_fields (void *obj);
 
void mono_gc_strong_handle_foreach(GFunc func, gpointer user_data);
 
void  mono_gc_register_for_finalization (MonoObject *obj, void *user_data);
void  mono_gc_add_memory_pressure (gint64 value);
MONO_API int   mono_gc_register_root (char *start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg);
void  mono_gc_deregister_root (char* addr);
void  mono_gc_finalize_domain (MonoDomain *domain);
void  mono_gc_run_finalize (void *obj, void *data);
void  mono_gc_clear_domain (MonoDomain * domain);
/* Signal early termination of finalizer processing inside the gc */
void  mono_gc_suspend_finalizers (void);
 
 
/* 
 * Register a root which can only be written using a write barrier.
 * Writes to the root must be done using a write barrier (MONO_ROOT_SETREF).
 * If the root uses an user defined mark routine, the writes are not required to be
 * to the area between START and START+SIZE.
 * The write barrier allows the GC to avoid scanning this root at each collection, so it
 * is more efficient.
 * FIXME: Add an API for clearing remset entries if a root with a user defined
 * mark routine is deleted.
 */
int mono_gc_register_root_wbarrier (char *start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg);
 
void mono_gc_wbarrier_set_root (gpointer ptr, MonoObject *value);
 
/* Set a field of a root registered using mono_gc_register_root_wbarrier () */
#define MONO_ROOT_SETREF(s,fieldname,value) do {    \
    mono_gc_wbarrier_set_root (&((s)->fieldname), (MonoObject*)value); \
} while (0)
 
/* fast allocation support */
 
typedef enum {
    // Regular fast path allocator.
    MANAGED_ALLOCATOR_REGULAR,
    // Managed allocator that just calls into the runtime.
    MANAGED_ALLOCATOR_SLOW_PATH,
    // Managed allocator that works like the regular one but also calls into the profiler.
    MANAGED_ALLOCATOR_PROFILER,
} ManagedAllocatorVariant;
 
int mono_gc_get_aligned_size_for_allocator (int size);
MonoMethod* mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size);
MonoMethod* mono_gc_get_managed_array_allocator (MonoClass *klass);
MonoMethod *mono_gc_get_managed_allocator_by_type (int atype, ManagedAllocatorVariant variant);
 
guint32 mono_gc_get_managed_allocator_types (void);
 
/* Return a short string identifying the GC, indented to be saved in AOT images */
const char *mono_gc_get_gc_name (void);
 
/* Fast write barriers */
MonoMethod* mono_gc_get_specific_write_barrier (gboolean is_concurrent);
MonoMethod* mono_gc_get_write_barrier (void);
 
/* Fast valuetype copy */
/* WARNING: [dest, dest + size] must be within the bounds of a single type, otherwise the GC will lose remset entries */
void mono_gc_wbarrier_range_copy (gpointer dest, gpointer src, int size);
void* mono_gc_get_range_copy_func (void);
 
 
/* helper for the managed alloc support */
MonoString *
ves_icall_string_alloc (int length);
 
/* 
 * Functions supplied by the runtime and called by the GC. Currently only used
 * by SGEN.
 */
typedef struct {
    /* 
     * Function called during thread startup/attach to allocate thread-local data 
     * needed by the other functions.
     */
    gpointer (*thread_attach_func) (void);
    /* 
     * Function called during thread deatch to free the data allocated by
     * thread_attach_func.
     */
    void (*thread_detach_func) (gpointer user_data);
    /* 
     * Function called from every thread when suspending for GC. It can save
     * data needed for marking from thread stacks. user_data is the data returned 
     * by attach_func. This might called with GC locks held and the word stopped,
     * so it shouldn't do any synchronization etc.
     */
    void (*thread_suspend_func) (gpointer user_data, void *sigcontext, MonoContext *ctx);
    /* 
     * Function called to mark from thread stacks. user_data is the data returned 
     * by attach_func. This is called twice, with the word stopped:
     * - in the first pass, it should mark areas of the stack using
     *   conservative marking by calling mono_gc_conservatively_scan_area ().
     * - in the second pass, it should mark the remaining areas of the stack
     *   using precise marking by calling mono_gc_scan_object ().
     */
    void (*thread_mark_func) (gpointer user_data, guint8 *stack_start, guint8 *stack_end, gboolean precise, void *gc_data);
    /*
     * Function called for debugging to get the current managed method for
     * tracking the provenances of objects.
     */
    gpointer (*get_provenance_func) (void);
} MonoGCCallbacks;
 
/* Set the callback functions callable by the GC */
void mono_gc_set_gc_callbacks (MonoGCCallbacks *callbacks);
MonoGCCallbacks *mono_gc_get_gc_callbacks (void);
 
/* Functions callable from the thread mark func */
 
/* Scan the memory area between START and END conservatively */
void mono_gc_conservatively_scan_area (void *start, void *end);
 
/* Scan OBJ, returning its new address */
void *mono_gc_scan_object (void *obj, void *gc_data);
 
/* Return the suspend signal number used by the GC to suspend threads,
   or -1 if not applicable. */
int mono_gc_get_suspend_signal (void);
 
/* Return the suspend signal number used by the GC to suspend threads,
   or -1 if not applicable. */
int mono_gc_get_restart_signal (void);
 
/*
 * Return a human readable description of the GC in malloc-ed memory.
 */
char* mono_gc_get_description (void);
 
/*
 * Configure the GC to desktop mode
 */
void mono_gc_set_desktop_mode (void);
 
/*
 * Return whenever this GC can move objects
 */
gboolean mono_gc_is_moving (void);
 
typedef void* (*MonoGCLockedCallbackFunc) (void *data);
 
void* mono_gc_invoke_with_gc_lock (MonoGCLockedCallbackFunc func, void *data);
 
int mono_gc_get_los_limit (void);
 
guint8* mono_gc_get_card_table (int *shift_bits, gpointer *card_mask);
gboolean mono_gc_card_table_nursery_check (void);
 
void* mono_gc_get_nursery (int *shift_bits, size_t *size);
 
void mono_gc_set_skip_thread (gboolean skip);
 
#ifndef HOST_WIN32
int mono_gc_pthread_create (pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
#endif
 
/*
 * Return whenever GC is disabled
 */
gboolean mono_gc_is_disabled (void);
 
/*
 * Return whenever this is the null GC
 */
gboolean mono_gc_is_null (void);
 
void mono_gc_set_string_length (MonoString *str, gint32 new_length);
 
#if defined(__MACH__)
void mono_gc_register_mach_exception_thread (pthread_t thread);
pthread_t mono_gc_get_mach_exception_thread (void);
#endif
 
gboolean mono_gc_precise_stack_mark_enabled (void);
 
typedef struct _RefQueueEntry RefQueueEntry;
 
struct _RefQueueEntry {
    void *dis_link;
    guint32 gchandle;
    MonoDomain *domain;
    void *user_data;
    RefQueueEntry *next;
};
 
struct _MonoReferenceQueue {
    RefQueueEntry *queue;
    mono_reference_queue_callback callback;
    MonoReferenceQueue *next;
    gboolean should_be_deleted;
};
 
enum {
    MONO_GC_FINALIZER_EXTENSION_VERSION = 1,
};
 
typedef struct {
    int version;
    gboolean (*is_class_finalization_aware) (MonoClass *klass);
    void (*object_queued_for_finalization) (MonoObject *object);
} MonoGCFinalizerCallbacks;
 
MONO_API void mono_gc_register_finalizer_callbacks (MonoGCFinalizerCallbacks *callbacks);
 
 
#ifdef HOST_WIN32
BOOL APIENTRY mono_gc_dllmain (HMODULE module_handle, DWORD reason, LPVOID reserved);
#endif
 
MonoVTable *mono_gc_get_vtable (MonoObject *obj);
 
guint mono_gc_get_vtable_bits (MonoClass *klass);
 
void mono_gc_register_altstack (gpointer stack, gint32 stack_size, gpointer altstack, gint32 altstack_size);
 
gboolean mono_gc_is_critical_method (MonoMethod *method);
 
gpointer mono_gc_thread_attach (THREAD_INFO_TYPE *info);
 
void mono_gc_thread_detach (THREAD_INFO_TYPE *info);
void mono_gc_thread_detach_with_lock (THREAD_INFO_TYPE *info);
 
gboolean mono_gc_thread_in_critical_region (THREAD_INFO_TYPE *info);
 
/* If set, print debugging messages around finalizers. */
extern gboolean log_finalizers;
 
/* If set, do not run finalizers. */
extern gboolean mono_do_not_finalize;
/* List of names of classes not to finalize. */
extern gchar **mono_do_not_finalize_class_names;
 
#endif /* __MONO_METADATA_GC_INTERNAL_H__ */