2005-08-21 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / metadata / domain-internals.h
1 /*
2  * Appdomain-related internal data structures and functions.
3  */
4 #ifndef __MONO_METADATA_DOMAIN_INTERNALS_H__
5 #define __MONO_METADATA_DOMAIN_INTERNALS_H__
6
7 #include <mono/metadata/appdomain.h>
8 #include <mono/utils/mono-codeman.h>
9 #include <mono/utils/mono-hash.h>
10 #include <mono/io-layer/io-layer.h>
11
12 extern CRITICAL_SECTION mono_delegate_section;
13
14 /* This is a copy of System.AppDomainSetup */
15 typedef struct {
16         MonoObject object;
17         MonoString *application_base;
18         MonoString *application_name;
19         MonoString *cache_path;
20         MonoString *configuration_file;
21         MonoString *dynamic_base;
22         MonoString *license_file;
23         MonoString *private_bin_path;
24         MonoString *private_bin_path_probe;
25         MonoString *shadow_copy_directories;
26         MonoString *shadow_copy_files;
27         MonoBoolean publisher_policy;
28         MonoBoolean path_changed;
29         int loader_optimization;
30         MonoBoolean disallow_binding_redirects;
31         MonoBoolean disallow_code_downloads;
32 } MonoAppDomainSetup;
33
34 typedef GArray MonoJitInfoTable;
35
36 typedef struct {
37         guint32  flags;
38         gint32   exvar_offset;
39         gpointer try_start;
40         gpointer try_end;
41         gpointer handler_start;
42         union {
43                 MonoClass *catch_class;
44                 gpointer filter;
45         } data;
46 } MonoJitExceptionInfo;
47
48 struct _MonoJitInfo {
49         MonoMethod *method;
50         gpointer    code_start;
51         guint32     used_regs;
52         int         code_size;
53         guint32     num_clauses:24;
54         /* Whenever the code is domain neutral or 'shared' */
55         gboolean    domain_neutral:1;
56         gboolean    cas_inited:1;
57         gboolean    cas_class_assert:1;
58         gboolean    cas_class_deny:1;
59         gboolean    cas_class_permitonly:1;
60         gboolean    cas_method_assert:1;
61         gboolean    cas_method_deny:1;
62         gboolean    cas_method_permitonly:1;
63         MonoJitExceptionInfo clauses [MONO_ZERO_LEN_ARRAY];
64 };
65
66 typedef struct {
67         MonoJitInfo *ji;
68         MonoCodeManager *code_mp;
69 } MonoJitDynamicMethodInfo;
70
71 struct _MonoAppContext {
72         MonoObject obj;
73         gint32 domain_id;
74         gint32 context_id;
75         gpointer *static_data;
76 };
77
78 typedef enum {
79         MONO_APPDOMAIN_CREATED,
80         MONO_APPDOMAIN_UNLOADING,
81         MONO_APPDOMAIN_UNLOADED
82 } MonoAppDomainState;
83
84 struct _MonoDomain {
85         MonoAppDomain      *domain;
86         CRITICAL_SECTION    lock;
87         MonoMemPool        *mp;
88         MonoCodeManager    *code_mp;
89         MonoGHashTable     *env;
90         GSList             *domain_assemblies;
91         MonoAssembly       *entry_assembly;
92         MonoAppDomainSetup *setup;
93         char               *friendly_name;
94         guint32            state;
95         MonoGHashTable     *ldstr_table;
96         GHashTable         *class_vtable_hash;
97         /* maps MonoString -> MonoRemoteClass */
98         MonoGHashTable     *proxy_vtable_hash;
99         MonoGHashTable     *static_data_hash;
100         GHashTable         *jit_code_hash;
101         /* maps MonoMethod -> MonoJitDynamicMethodInfo */
102         GHashTable         *dynamic_code_hash;
103         /* maps delegate trampoline addr -> delegate object */
104         MonoGHashTable     *delegate_hash_table;
105         MonoJitInfoTable   *jit_info_table;
106         /* hashtables for Reflection handles */
107         MonoGHashTable     *type_hash;
108         MonoGHashTable     *refobject_hash;
109         /* Needed by Thread:GetDomainID() */
110         gint32             domain_id;
111         /* Used when loading assemblies */
112         gchar **search_path;
113         /* Used by remoting proxies */
114         MonoMethod         *create_proxy_for_type_method;
115         MonoMethod         *private_invoke_method;
116         MonoAppContext     *default_context;
117         MonoException      *out_of_memory_ex;
118         MonoException      *null_reference_ex;
119         MonoException      *stack_overflow_ex;
120         /* Used to store offsets of thread and context static fields */
121         GHashTable         *special_static_fields;
122         GHashTable         *jump_target_hash;
123         GHashTable         *class_init_trampoline_hash;
124         GHashTable         *jump_trampoline_hash;
125         GHashTable         *jit_trampoline_hash;
126         GHashTable         *delegate_trampoline_hash;
127         /* 
128          * This must be a GHashTable, since these objects can't be finalized
129          * if the hashtable contains a GC visible reference to them.
130          */
131         GHashTable         *finalizable_objects_hash;
132         /* Used when accessing 'domain_assemblies' */
133         CRITICAL_SECTION    assemblies_lock;
134 };
135
136 typedef struct  {
137         guint16 major, minor, build, revision;
138 } AssemblyVersionSet;
139
140 /* MonoRuntimeInfo: Contains information about versions supported by this runtime */
141 typedef struct  {
142         const char runtime_version [12];
143         const char framework_version [4];
144         const AssemblyVersionSet version_sets [2];
145 } MonoRuntimeInfo;
146
147 #define mono_domain_lock(domain)   EnterCriticalSection(&(domain)->lock)
148 #define mono_domain_unlock(domain) LeaveCriticalSection(&(domain)->lock)
149 #define mono_domain_assemblies_lock(domain)   EnterCriticalSection(&(domain)->assemblies_lock)
150 #define mono_domain_assemblies_unlock(domain) LeaveCriticalSection(&(domain)->assemblies_lock)
151
152 void
153 mono_jit_info_table_add    (MonoDomain *domain, MonoJitInfo *ji);
154
155 void
156 mono_jit_info_table_remove (MonoDomain *domain, MonoJitInfo *ji);
157
158 void
159 mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end);
160
161 /* 
162  * Installs a new function which is used to return a MonoJitInfo for a method inside
163  * an AOT module.
164  */
165 typedef MonoJitInfo *(*MonoJitInfoFindInAot)         (MonoDomain *domain, MonoImage *image, gpointer addr);
166 void          mono_install_jit_info_find_in_aot (MonoJitInfoFindInAot func);
167
168 MonoAppDomain *
169 ves_icall_System_AppDomain_getCurDomain            (void);
170
171 MonoAppDomain *
172 ves_icall_System_AppDomain_getRootDomain           (void);
173
174 MonoAppDomain *
175 ves_icall_System_AppDomain_createDomain            (MonoString         *friendly_name,
176                                                     MonoAppDomainSetup *setup);
177
178 MonoObject *
179 ves_icall_System_AppDomain_GetData                 (MonoAppDomain *ad, 
180                                                     MonoString    *name);
181
182 MonoReflectionAssembly *
183 ves_icall_System_AppDomain_LoadAssemblyRaw         (MonoAppDomain *ad,
184                                                     MonoArray *raw_assembly, 
185                                                     MonoArray *raw_symbol_store,
186                                                     MonoObject *evidence,
187                                                     MonoBoolean refonly);
188
189 void
190 ves_icall_System_AppDomain_SetData                 (MonoAppDomain *ad, 
191                                                     MonoString    *name, 
192                                                     MonoObject    *data);
193
194 MonoAppDomainSetup *
195 ves_icall_System_AppDomain_getSetup                (MonoAppDomain *ad);
196
197 MonoString *
198 ves_icall_System_AppDomain_getFriendlyName         (MonoAppDomain *ad);
199
200 MonoArray *
201 ves_icall_System_AppDomain_GetAssemblies           (MonoAppDomain *ad,
202                                                     MonoBoolean refonly);
203
204 MonoReflectionAssembly *
205 ves_icall_System_Reflection_Assembly_LoadFrom      (MonoString *fname,
206                                                     MonoBoolean refonly);
207
208 MonoReflectionAssembly *
209 ves_icall_System_AppDomain_LoadAssembly            (MonoAppDomain *ad, 
210                                                     MonoString *assRef,
211                                                     MonoObject    *evidence,
212                                                     MonoBoolean refonly);
213
214 gboolean
215 ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id);
216
217 void
218 ves_icall_System_AppDomain_InternalUnload          (gint32 domain_id);
219
220 gint32
221 ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomain *ad, 
222                                                     MonoString    *file, 
223                                                     MonoObject    *evidence,
224                                                     MonoArray     *args);
225
226 MonoAppDomain * 
227 ves_icall_System_AppDomain_InternalSetDomain       (MonoAppDomain *ad);
228
229 MonoAppDomain * 
230 ves_icall_System_AppDomain_InternalSetDomainByID   (gint32 domainid);
231
232 void
233 ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomain *ad);
234
235 void
236 ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id);
237
238 void
239 ves_icall_System_AppDomain_InternalPopDomainRef (void);
240
241 MonoAppContext * 
242 ves_icall_System_AppDomain_InternalGetContext      (void);
243
244 MonoAppContext * 
245 ves_icall_System_AppDomain_InternalGetDefaultContext      (void);
246
247 MonoAppContext * 
248 ves_icall_System_AppDomain_InternalSetContext      (MonoAppContext *mc);
249
250 gint32 
251 ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad);
252
253 MonoString *
254 ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid);
255
256 MonoAssembly *
257 mono_assembly_load_corlib (const MonoRuntimeInfo *runtime, MonoImageOpenStatus *status);
258
259 const MonoRuntimeInfo*
260 mono_get_runtime_info (void);
261
262 gboolean
263 mono_assembly_name_parse (const char *name, MonoAssemblyName *aname);
264
265 void
266 mono_assembly_name_free (MonoAssemblyName *aname);
267
268 #endif /* __MONO_METADATA_DOMAIN_INTERNALS_H__ */