[runtime] Use the mono_mutex types/functions instead of CriticalSection's.
[mono.git] / mono / metadata / domain-internals.h
1 /*
2  * Appdomain-related internal data structures and functions.
3  * Copyright 2012 Xamarin Inc (http://www.xamarin.com)
4  */
5 #ifndef __MONO_METADATA_DOMAIN_INTERNALS_H__
6 #define __MONO_METADATA_DOMAIN_INTERNALS_H__
7
8 #include <mono/metadata/appdomain.h>
9 #include <mono/metadata/mempool.h>
10 #include <mono/metadata/lock-tracer.h>
11 #include <mono/utils/mono-codeman.h>
12 #include <mono/metadata/mono-hash.h>
13 #include <mono/utils/mono-compiler.h>
14 #include <mono/utils/mono-internal-hash.h>
15 #include <mono/io-layer/io-layer.h>
16 #include <mono/metadata/mempool-internals.h>
17
18 extern mono_mutex_t mono_delegate_section;
19 extern mono_mutex_t mono_strtod_mutex;
20
21 /*
22  * If this is set, the memory belonging to appdomains is not freed when a domain is
23  * unloaded, and assemblies loaded by the appdomain are not unloaded either. This
24  * allows us to use typed gc in non-default appdomains too, leading to increased
25  * performance.
26  */ 
27 extern gboolean mono_dont_free_domains;
28
29 /* This is a copy of System.AppDomainSetup */
30 typedef struct {
31         MonoObject object;
32         MonoString *application_base;
33         MonoString *application_name;
34         MonoString *cache_path;
35         MonoString *configuration_file;
36         MonoString *dynamic_base;
37         MonoString *license_file;
38         MonoString *private_bin_path;
39         MonoString *private_bin_path_probe;
40         MonoString *shadow_copy_directories;
41         MonoString *shadow_copy_files;
42         MonoBoolean publisher_policy;
43         MonoBoolean path_changed;
44         int loader_optimization;
45         MonoBoolean disallow_binding_redirects;
46         MonoBoolean disallow_code_downloads;
47         MonoObject *activation_arguments; /* it is System.Object in 1.x, ActivationArguments in 2.0 */
48         MonoObject *domain_initializer;
49         MonoObject *application_trust; /* it is System.Object in 1.x, ApplicationTrust in 2.0 */
50         MonoArray *domain_initializer_args;
51         MonoBoolean disallow_appbase_probe;
52         MonoArray *configuration_bytes;
53         MonoArray *serialized_non_primitives;
54 } MonoAppDomainSetup;
55
56 typedef struct _MonoJitInfoTable MonoJitInfoTable;
57 typedef struct _MonoJitInfoTableChunk MonoJitInfoTableChunk;
58
59 #define MONO_JIT_INFO_TABLE_CHUNK_SIZE          64
60
61 struct _MonoJitInfoTableChunk
62 {
63         int                    refcount;
64         volatile int           num_elements;
65         volatile gint8        *last_code_end;
66         MonoJitInfo * volatile data [MONO_JIT_INFO_TABLE_CHUNK_SIZE];
67 };
68
69 struct _MonoJitInfoTable
70 {
71         MonoDomain             *domain;
72         int                     num_chunks;
73         MonoJitInfoTableChunk  *chunks [MONO_ZERO_LEN_ARRAY];
74 };
75
76 #define MONO_SIZEOF_JIT_INFO_TABLE (sizeof (struct _MonoJitInfoTable) - MONO_ZERO_LEN_ARRAY * SIZEOF_VOID_P)
77
78 typedef GArray MonoAotModuleInfoTable;
79
80 typedef struct {
81         guint32  flags;
82         gint32   exvar_offset;
83         gpointer try_start;
84         gpointer try_end;
85         gpointer handler_start;
86         union {
87                 MonoClass *catch_class;
88                 gpointer filter;
89                 gpointer handler_end;
90         } data;
91 } MonoJitExceptionInfo;
92
93 /*
94  * Contains information about the type arguments for generic shared methods.
95  */
96 typedef struct {
97         /*
98          * If not NULL, determines whenever the class type arguments of the gshared method are references or vtypes.
99          * The array length is equal to class_inst->type_argv.
100          */
101         gboolean *var_is_vt;
102         /* Same for method type parameters */
103         gboolean *mvar_is_vt;
104 } MonoGenericSharingContext;
105
106 /* Simplified DWARF location list entry */
107 typedef struct {
108         /* Whenever the value is in a register */
109         gboolean is_reg;
110         /*
111          * If is_reg is TRUE, the register which contains the value. Otherwise
112          * the base register.
113          */
114         int reg;
115         /*
116          * If is_reg is FALSE, the offset of the stack location relative to 'reg'.
117          * Otherwise, 0.
118          */
119         int offset;
120         /*
121          * Offsets of the PC interval where the value is in this location.
122          */
123         int from, to;
124 } MonoDwarfLocListEntry;
125
126 typedef struct
127 {
128         MonoGenericSharingContext *generic_sharing_context;
129         int nlocs;
130         MonoDwarfLocListEntry *locations;
131         gint32 this_offset;
132         guint8 this_reg;
133         gboolean has_this:1;
134         gboolean this_in_reg:1;
135 } MonoGenericJitInfo;
136
137 /*
138 A try block hole is used to represent a non-contiguous part of
139 of a segment of native code protected by a given .try block.
140 Usually, a try block is defined as a contiguous segment of code.
141 But in some cases it's needed to have some parts of it to not be protected.
142 For example, given "try {} finally {}", the code in the .try block to call
143 the finally part looks like:
144
145 try {
146     ...
147         call finally_block
148         adjust stack
149         jump outside try block
150         ...
151 } finally {
152         ...
153 }
154
155 The instructions between the call and the jump should not be under the try block since they happen
156 after the finally block executes, which means if an async exceptions happens at that point we would
157 execute the finally clause twice. So, to avoid this, we introduce a hole in the try block to signal
158 that those instructions are not protected.
159 */
160 typedef struct
161 {
162         guint32 offset;
163         guint16 clause;
164         guint16 length;
165 } MonoTryBlockHoleJitInfo;
166
167 typedef struct
168 {
169         guint16 num_holes;
170         MonoTryBlockHoleJitInfo holes [MONO_ZERO_LEN_ARRAY];
171 } MonoTryBlockHoleTableJitInfo;
172
173 typedef struct
174 {
175         guint32 stack_size;
176 } MonoArchEHJitInfo;
177
178 typedef struct {
179         gboolean    cas_inited:1;
180         gboolean    cas_class_assert:1;
181         gboolean    cas_class_deny:1;
182         gboolean    cas_class_permitonly:1;
183         gboolean    cas_method_assert:1;
184         gboolean    cas_method_deny:1;
185         gboolean    cas_method_permitonly:1;
186 } MonoMethodCasInfo;
187
188 struct _MonoJitInfo {
189         /* NOTE: These first two elements (method and
190            next_jit_code_hash) must be in the same order and at the
191            same offset as in RuntimeMethod, because of the jit_code_hash
192            internal hash table in MonoDomain. */
193         union {
194                 MonoMethod *method;
195                 MonoImage *image;
196                 gpointer aot_info;
197         } d;
198         struct _MonoJitInfo *next_jit_code_hash;
199         gpointer    code_start;
200         guint32     unwind_info;
201         int         code_size;
202         guint32     num_clauses:15;
203         /* Whenever the code is domain neutral or 'shared' */
204         gboolean    domain_neutral:1;
205         gboolean    has_cas_info:1;
206         gboolean    has_generic_jit_info:1;
207         gboolean    has_try_block_holes:1;
208         gboolean    has_arch_eh_info:1;
209         gboolean    from_aot:1;
210         gboolean    from_llvm:1;
211         gboolean    dbg_hidden_inited:1;
212         gboolean    dbg_hidden:1;
213         /* Whenever this jit info was loaded in async context */
214         gboolean    async:1;
215         gboolean    dbg_step_through_inited:1;
216         gboolean    dbg_step_through:1;
217         gboolean    dbg_non_user_code_inited:1;
218         gboolean    dbg_non_user_code:1;
219
220         /* FIXME: Embed this after the structure later*/
221         gpointer    gc_info; /* Currently only used by SGen */
222         
223         MonoJitExceptionInfo clauses [MONO_ZERO_LEN_ARRAY];
224         /* There is an optional MonoGenericJitInfo after the clauses */
225         /* There is an optional MonoTryBlockHoleTableJitInfo after MonoGenericJitInfo clauses*/
226         /* There is an optional MonoArchEHJitInfo after MonoTryBlockHoleTableJitInfo */
227 };
228
229 #define MONO_SIZEOF_JIT_INFO (offsetof (struct _MonoJitInfo, clauses))
230
231 struct _MonoAppContext {
232         MonoObject obj;
233         gint32 domain_id;
234         gint32 context_id;
235         gpointer *static_data;
236 };
237
238 /* Lock-free allocator */
239 typedef struct {
240         guint8 *mem;
241         gpointer prev;
242         int size, pos;
243 } LockFreeMempoolChunk;
244
245 typedef struct {
246         LockFreeMempoolChunk *current, *chunks;
247 } LockFreeMempool;
248
249 /*
250  * We have two unloading states because the domain
251  * must remain fully functional while AppDomain::DomainUnload is
252  * processed.
253  * After that unloading began and all domain facilities are teared down
254  * such as execution of new threadpool jobs.  
255  */
256 typedef enum {
257         MONO_APPDOMAIN_CREATED,
258         MONO_APPDOMAIN_UNLOADING_START,
259         MONO_APPDOMAIN_UNLOADING,
260         MONO_APPDOMAIN_UNLOADED
261 } MonoAppDomainState;
262
263 typedef struct _MonoThunkFreeList {
264         guint32 size;
265         int length;             /* only valid for the wait list */
266         struct _MonoThunkFreeList *next;
267 } MonoThunkFreeList;
268
269 typedef struct _MonoJitCodeHash MonoJitCodeHash;
270
271 typedef struct _MonoTlsDataRecord MonoTlsDataRecord;
272 struct _MonoTlsDataRecord {
273         MonoTlsDataRecord *next;
274         guint32 tls_offset;
275         guint32 size;
276 };
277
278 struct _MonoDomain {
279         /*
280          * This lock must never be taken before the loader lock,
281          * i.e. if both are taken by the same thread, the loader lock
282          * must taken first.
283          */
284         mono_mutex_t    lock;
285         MonoMemPool        *mp;
286         MonoCodeManager    *code_mp;
287         /*
288          * keep all the managed objects close to each other for the precise GC
289          * For the Boehm GC we additionally keep close also other GC-tracked pointers.
290          */
291 #define MONO_DOMAIN_FIRST_OBJECT setup
292         MonoAppDomainSetup *setup;
293         MonoAppDomain      *domain;
294         MonoAppContext     *default_context;
295         MonoException      *out_of_memory_ex;
296         MonoException      *null_reference_ex;
297         MonoException      *stack_overflow_ex;
298         /* typeof (void) */
299         MonoObject         *typeof_void;
300         /* Ephemeron Tombstone*/
301         MonoObject         *ephemeron_tombstone;
302         /* new MonoType [0] */
303         MonoArray          *empty_types;
304         /* 
305          * The fields between FIRST_GC_TRACKED and LAST_GC_TRACKED are roots, but
306          * not object references.
307          */
308 #define MONO_DOMAIN_FIRST_GC_TRACKED env
309         MonoGHashTable     *env;
310         MonoGHashTable     *ldstr_table;
311         /* hashtables for Reflection handles */
312         MonoGHashTable     *type_hash;
313         MonoGHashTable     *refobject_hash;
314         /* a GC-tracked array to keep references to the static fields of types */
315         gpointer           *static_data_array;
316         /* maps class -> type initialization exception object */
317         MonoGHashTable    *type_init_exception_hash;
318         /* maps delegate trampoline addr -> delegate object */
319         MonoGHashTable     *delegate_hash_table;
320 #define MONO_DOMAIN_LAST_GC_TRACKED delegate_hash_table
321         guint32            state;
322         /* Needed by Thread:GetDomainID() */
323         gint32             domain_id;
324         gint32             shadow_serial;
325         unsigned char      inet_family_hint; // used in socket-io.c as a cache
326         GSList             *domain_assemblies;
327         MonoAssembly       *entry_assembly;
328         char               *friendly_name;
329         GPtrArray          *class_vtable_array;
330         /* maps remote class key -> MonoRemoteClass */
331         GHashTable         *proxy_vtable_hash;
332         /* Protected by 'jit_code_hash_lock' */
333         MonoInternalHashTable jit_code_hash;
334         mono_mutex_t    jit_code_hash_lock;
335         int                 num_jit_info_tables;
336         MonoJitInfoTable * 
337           volatile          jit_info_table;
338         /*
339          * Contains information about AOT loaded code.
340          * Only used in the root domain.
341          */
342         MonoJitInfoTable *
343           volatile          aot_modules;
344         GSList             *jit_info_free_queue;
345         /* Used when loading assemblies */
346         gchar **search_path;
347         gchar *private_bin_path;
348         LockFreeMempool *lock_free_mp;
349         
350         /* Used by remoting proxies */
351         MonoMethod         *create_proxy_for_type_method;
352         MonoMethod         *private_invoke_method;
353         /* Used to store offsets of thread and context static fields */
354         GHashTable         *special_static_fields;
355         MonoTlsDataRecord  *tlsrec_list;
356         /* 
357          * This must be a GHashTable, since these objects can't be finalized
358          * if the hashtable contains a GC visible reference to them.
359          */
360         GHashTable         *finalizable_objects_hash;
361
362         /* Protects the three hashes above */
363         mono_mutex_t   finalizable_objects_hash_lock;
364         /* Used when accessing 'domain_assemblies' */
365         mono_mutex_t    assemblies_lock;
366
367         GHashTable         *method_rgctx_hash;
368
369         GHashTable         *generic_virtual_cases;
370         MonoThunkFreeList **thunk_free_lists;
371
372         GHashTable     *generic_virtual_thunks;
373
374         /* Information maintained by the JIT engine */
375         gpointer runtime_info;
376
377         /*thread pool jobs, used to coordinate shutdown.*/
378         volatile int                    threadpool_jobs;
379         HANDLE                          cleanup_semaphore;
380         
381         /* Contains the compiled runtime invoke wrapper used by finalizers */
382         gpointer            finalize_runtime_invoke;
383
384         /* Contains the compiled runtime invoke wrapper used by async resylt creation to capture thread context*/
385         gpointer            capture_context_runtime_invoke;
386
387         /* Contains the compiled method used by async resylt creation to capture thread context*/
388         gpointer            capture_context_method;
389
390         /* Assembly bindings, the per-domain part */
391         GSList *assembly_bindings;
392         gboolean assembly_bindings_parsed;
393
394         /* Used by socket-io.c */
395         /* These are domain specific, since the assembly can be unloaded */
396         MonoImage *socket_assembly;
397         MonoClass *sockaddr_class;
398         MonoClassField *sockaddr_data_field;
399
400         /* Used by threadpool.c */
401         MonoImage *system_image;
402         MonoClass *corlib_asyncresult_class;
403         MonoClass *socket_class;
404         MonoClass *ad_unloaded_ex_class;
405         MonoClass *process_class;
406
407         /* Cache function pointers for architectures  */
408         /* that require wrappers */
409         GHashTable *ftnptrs_hash;
410
411         guint32 execution_context_field_offset;
412 };
413
414 typedef struct  {
415         guint16 major, minor, build, revision;
416 } AssemblyVersionSet;
417
418 /* MonoRuntimeInfo: Contains information about versions supported by this runtime */
419 typedef struct  {
420         const char runtime_version [12];
421         const char framework_version [4];
422         const AssemblyVersionSet version_sets [4];
423 } MonoRuntimeInfo;
424
425 #define mono_domain_lock(domain) mono_locks_acquire(&(domain)->lock, DomainLock)
426 #define mono_domain_unlock(domain) mono_locks_release(&(domain)->lock, DomainLock)
427 #define mono_domain_assemblies_lock(domain) mono_locks_acquire(&(domain)->assemblies_lock, DomainAssembliesLock)
428 #define mono_domain_assemblies_unlock(domain) mono_locks_release(&(domain)->assemblies_lock, DomainAssembliesLock)
429 #define mono_domain_jit_code_hash_lock(domain) mono_locks_acquire(&(domain)->jit_code_hash_lock, DomainJitCodeHashLock)
430 #define mono_domain_jit_code_hash_unlock(domain) mono_locks_release(&(domain)->jit_code_hash_lock, DomainJitCodeHashLock)
431
432 typedef MonoDomain* (*MonoLoadFunc) (const char *filename, const char *runtime_version);
433
434 void
435 mono_install_runtime_load  (MonoLoadFunc func) MONO_INTERNAL;
436
437 MonoDomain*
438 mono_runtime_load (const char *filename, const char *runtime_version) MONO_INTERNAL;
439
440 typedef void (*MonoCreateDomainFunc) (MonoDomain *domain);
441
442 void
443 mono_install_create_domain_hook (MonoCreateDomainFunc func) MONO_INTERNAL;
444
445 typedef void (*MonoFreeDomainFunc) (MonoDomain *domain);
446
447 void
448 mono_install_free_domain_hook (MonoFreeDomainFunc func) MONO_INTERNAL;
449
450 void 
451 mono_cleanup (void) MONO_INTERNAL;
452
453 void
454 mono_close_exe_image (void) MONO_INTERNAL;
455
456 void
457 mono_jit_info_table_add    (MonoDomain *domain, MonoJitInfo *ji) MONO_INTERNAL;
458
459 void
460 mono_jit_info_table_remove (MonoDomain *domain, MonoJitInfo *ji) MONO_INTERNAL;
461
462 void
463 mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end) MONO_INTERNAL;
464
465 MonoGenericJitInfo*
466 mono_jit_info_get_generic_jit_info (MonoJitInfo *ji) MONO_INTERNAL;
467
468 MonoGenericSharingContext*
469 mono_jit_info_get_generic_sharing_context (MonoJitInfo *ji) MONO_INTERNAL;
470
471 void
472 mono_jit_info_set_generic_sharing_context (MonoJitInfo *ji, MonoGenericSharingContext *gsctx) MONO_INTERNAL;
473
474 char *
475 mono_make_shadow_copy (const char *filename) MONO_INTERNAL;
476
477 gboolean
478 mono_is_shadow_copy_enabled (MonoDomain *domain, const gchar *dir_name) MONO_INTERNAL;
479
480 gpointer
481 mono_domain_alloc  (MonoDomain *domain, guint size) MONO_INTERNAL;
482
483 gpointer
484 mono_domain_alloc0 (MonoDomain *domain, guint size) MONO_INTERNAL;
485
486 gpointer
487 mono_domain_alloc0_lock_free (MonoDomain *domain, guint size) MONO_INTERNAL;
488
489 void*
490 mono_domain_code_reserve (MonoDomain *domain, int size) MONO_LLVM_INTERNAL;
491
492 void*
493 mono_domain_code_reserve_align (MonoDomain *domain, int size, int alignment) MONO_INTERNAL;
494
495 void
496 mono_domain_code_commit (MonoDomain *domain, void *data, int size, int newsize) MONO_INTERNAL;
497
498 void *
499 nacl_domain_get_code_dest (MonoDomain *domain, void *data) MONO_INTERNAL;
500
501 void 
502 nacl_domain_code_validate (MonoDomain *domain, guint8 **buf_base, int buf_size, guint8 **code_end) MONO_INTERNAL;
503
504 void
505 mono_domain_code_foreach (MonoDomain *domain, MonoCodeManagerFunc func, void *user_data) MONO_INTERNAL;
506
507 void
508 mono_domain_unset (void) MONO_INTERNAL;
509
510 void
511 mono_domain_set_internal_with_options (MonoDomain *domain, gboolean migrate_exception) MONO_INTERNAL;
512
513 MonoTryBlockHoleTableJitInfo*
514 mono_jit_info_get_try_block_hole_table_info (MonoJitInfo *ji) MONO_INTERNAL;
515
516 MonoArchEHJitInfo*
517 mono_jit_info_get_arch_eh_info (MonoJitInfo *ji) MONO_INTERNAL;
518
519 MonoMethodCasInfo*
520 mono_jit_info_get_cas_info (MonoJitInfo *ji) MONO_INTERNAL;
521
522 /* 
523  * Installs a new function which is used to return a MonoJitInfo for a method inside
524  * an AOT module.
525  */
526 typedef MonoJitInfo *(*MonoJitInfoFindInAot)         (MonoDomain *domain, MonoImage *image, gpointer addr);
527 void          mono_install_jit_info_find_in_aot (MonoJitInfoFindInAot func) MONO_INTERNAL;
528
529 void
530 mono_jit_code_hash_init (MonoInternalHashTable *jit_code_hash) MONO_INTERNAL;
531
532 MonoAppDomain *
533 ves_icall_System_AppDomain_getCurDomain            (void) MONO_INTERNAL;
534
535 MonoAppDomain *
536 ves_icall_System_AppDomain_getRootDomain           (void) MONO_INTERNAL;
537
538 MonoAppDomain *
539 ves_icall_System_AppDomain_createDomain            (MonoString         *friendly_name,
540                                                     MonoAppDomainSetup *setup) MONO_INTERNAL;
541
542 MonoObject *
543 ves_icall_System_AppDomain_GetData                 (MonoAppDomain *ad, 
544                                                     MonoString    *name) MONO_INTERNAL;
545
546 MonoReflectionAssembly *
547 ves_icall_System_AppDomain_LoadAssemblyRaw         (MonoAppDomain *ad,
548                                                     MonoArray *raw_assembly, 
549                                                     MonoArray *raw_symbol_store,
550                                                     MonoObject *evidence,
551                                                     MonoBoolean refonly) MONO_INTERNAL;
552
553 void
554 ves_icall_System_AppDomain_SetData                 (MonoAppDomain *ad, 
555                                                     MonoString    *name, 
556                                                     MonoObject    *data) MONO_INTERNAL;
557
558 MonoAppDomainSetup *
559 ves_icall_System_AppDomain_getSetup                (MonoAppDomain *ad) MONO_INTERNAL;
560
561 MonoString *
562 ves_icall_System_AppDomain_getFriendlyName         (MonoAppDomain *ad) MONO_INTERNAL;
563
564 MonoArray *
565 ves_icall_System_AppDomain_GetAssemblies           (MonoAppDomain *ad,
566                                                     MonoBoolean refonly) MONO_INTERNAL;
567
568 MonoReflectionAssembly *
569 ves_icall_System_Reflection_Assembly_LoadFrom      (MonoString *fname,
570                                                     MonoBoolean refonly) MONO_INTERNAL;
571
572 MonoReflectionAssembly *
573 ves_icall_System_AppDomain_LoadAssembly            (MonoAppDomain *ad, 
574                                                     MonoString *assRef,
575                                                     MonoObject    *evidence,
576                                                     MonoBoolean refonly) MONO_INTERNAL;
577
578 gboolean
579 ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id) MONO_INTERNAL;
580
581 void
582 ves_icall_System_AppDomain_InternalUnload          (gint32 domain_id) MONO_INTERNAL;
583
584 gint32
585 ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomain *ad, 
586                                                                                                         MonoReflectionAssembly *refass,
587                                                                                                         MonoArray     *args) MONO_INTERNAL;
588
589 MonoAppDomain * 
590 ves_icall_System_AppDomain_InternalSetDomain       (MonoAppDomain *ad) MONO_INTERNAL;
591
592 MonoAppDomain * 
593 ves_icall_System_AppDomain_InternalSetDomainByID   (gint32 domainid) MONO_INTERNAL;
594
595 void
596 ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomain *ad) MONO_INTERNAL;
597
598 void
599 ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id) MONO_INTERNAL;
600
601 void
602 ves_icall_System_AppDomain_InternalPopDomainRef (void) MONO_INTERNAL;
603
604 MonoAppContext * 
605 ves_icall_System_AppDomain_InternalGetContext      (void) MONO_INTERNAL;
606
607 MonoAppContext * 
608 ves_icall_System_AppDomain_InternalGetDefaultContext      (void) MONO_INTERNAL;
609
610 MonoAppContext * 
611 ves_icall_System_AppDomain_InternalSetContext      (MonoAppContext *mc) MONO_INTERNAL;
612
613 gint32 
614 ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad) MONO_INTERNAL;
615
616 MonoString *
617 ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid) MONO_INTERNAL;
618
619 MonoAssembly *
620 mono_assembly_load_corlib (const MonoRuntimeInfo *runtime, MonoImageOpenStatus *status) MONO_INTERNAL;
621
622 const MonoRuntimeInfo*
623 mono_get_runtime_info (void) MONO_INTERNAL;
624
625 void
626 mono_runtime_set_no_exec (gboolean val) MONO_INTERNAL;
627
628 gboolean
629 mono_runtime_get_no_exec (void) MONO_INTERNAL;
630
631 gboolean
632 mono_assembly_name_parse (const char *name, MonoAssemblyName *aname) MONO_INTERNAL;
633
634 MonoImage *mono_assembly_open_from_bundle (const char *filename,
635                                            MonoImageOpenStatus *status,
636                                            gboolean refonly) MONO_INTERNAL;
637
638 MONO_API void
639 mono_domain_add_class_static_data (MonoDomain *domain, MonoClass *klass, gpointer data, guint32 *bitmap);
640
641 MonoReflectionAssembly *
642 mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, gboolean refonly) MONO_INTERNAL;
643
644 MonoAssembly* mono_assembly_load_full_nosearch (MonoAssemblyName *aname, 
645                                                 const char       *basedir, 
646                                                 MonoImageOpenStatus *status,
647                                                 gboolean refonly) MONO_INTERNAL;
648
649 void mono_set_private_bin_path_from_config (MonoDomain *domain) MONO_INTERNAL;
650
651 int mono_framework_version (void) MONO_INTERNAL;
652
653 void mono_reflection_cleanup_domain (MonoDomain *domain) MONO_INTERNAL;
654
655 void mono_assembly_cleanup_domain_bindings (guint32 domain_id) MONO_INTERNAL;
656
657 MonoJitInfo* mono_jit_info_table_find_internal (MonoDomain *domain, char *addr, gboolean try_aot) MONO_INTERNAL;
658
659 void mono_enable_debug_domain_unload (gboolean enable);
660
661 #endif /* __MONO_METADATA_DOMAIN_INTERNALS_H__ */