2004-05-11 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / metadata / appdomain.h
1 /*
2  * appdomain.h: AppDomain functions
3  *
4  * Author:
5  *      Dietmar Maurer (dietmar@ximian.com)
6  *
7  * (C) 2001 Ximian, Inc.
8  */
9
10 #ifndef _MONO_METADATA_APPDOMAIN_H_
11 #define _MONO_METADATA_APPDOMAIN_H_
12
13 #include <glib.h>
14
15 #include <mono/metadata/object.h>
16 #include <mono/metadata/reflection.h>
17 #include <mono/metadata/mempool.h>
18 #include <mono/utils/mono-hash.h>
19 #include <mono/utils/mono-codeman.h>
20 #include <mono/io-layer/io-layer.h>
21
22 typedef void (*MonoThreadStartCB) (guint32 tid, gpointer stack_start,
23                                    gpointer func);
24 typedef void (*MonoThreadAttachCB) (guint32 tid, gpointer stack_start);
25
26 /* This is a copy of System.AppDomainSetup */
27 typedef struct {
28         MonoObject object;
29         MonoString *application_base;
30         MonoString *application_name;
31         MonoString *cache_path;
32         MonoString *configuration_file;
33         MonoString *dynamic_base;
34         MonoString *license_file;
35         MonoString *private_bin_path;
36         MonoString *private_bin_path_probe;
37         MonoString *shadow_copy_directories;
38         MonoString *shadow_copy_files;
39         MonoBoolean publisher_policy;
40         MonoBoolean path_changed;
41         int loader_optimization;
42         MonoBoolean disallow_binding_redirects;
43         MonoBoolean disallow_code_downloads;
44 } MonoAppDomainSetup;
45
46 typedef GArray MonoJitInfoTable;
47
48 typedef struct {
49         guint32  flags;
50         gpointer try_start;
51         gpointer try_end;
52         gpointer handler_start;
53         union {
54                 guint32 token;
55                 gpointer filter;
56         } data;
57 } MonoJitExceptionInfo;
58
59 typedef struct {
60         MonoMethod *method;
61         gpointer    code_start;
62         int         code_size;
63         guint32     used_regs;
64         unsigned    num_clauses;
65         signed      exvar_offset;
66         /* Whenever the code is domain neutral or 'shared' */
67         gboolean    domain_neutral:1;
68         MonoJitExceptionInfo *clauses;
69 } MonoJitInfo;
70
71 typedef struct {
72         MonoObject obj;
73         gint32 domain_id;
74         gint32 context_id;
75         gpointer *static_data;
76 } MonoAppContext;
77
78 typedef enum {
79         MONO_APPDOMAIN_CREATED,
80         MONO_APPDOMAIN_UNLOADING,
81         MONO_APPDOMAIN_UNLOADED
82 } MonoAppDomainState;
83
84 typedef struct _MonoAppDomain MonoAppDomain;
85
86 struct _MonoDomain {
87         MonoAppDomain      *domain;
88         CRITICAL_SECTION    lock;
89         MonoMemPool        *mp;
90         MonoCodeManager    *code_mp;
91         MonoGHashTable     *env;
92         GHashTable         *assemblies;
93         MonoAssembly       *entry_assembly;
94         MonoAppDomainSetup *setup;
95         char               *friendly_name;
96         guint32            state;
97         MonoGHashTable     *ldstr_table;
98         MonoGHashTable     *class_vtable_hash;
99         MonoGHashTable     *proxy_vtable_hash;
100         MonoGHashTable     *static_data_hash;
101         GHashTable         *jit_code_hash;
102         MonoJitInfoTable   *jit_info_table;
103         /* hashtables for Reflection handles */
104         MonoGHashTable     *type_hash;
105         MonoGHashTable     *refobject_hash;
106         /* Needed by Thread:GetDomainID() */
107         gint32             domain_id;
108         /* Used when loading assemblies */
109         gchar **search_path;
110         /* Used by remoting proxies */
111         MonoMethod         *create_proxy_for_type_method;
112         MonoMethod         *private_invoke_method;
113         MonoAppContext     *default_context;
114         MonoException      *out_of_memory_ex;
115         MonoException      *null_reference_ex;
116         MonoException      *stack_overflow_ex;
117         /* Used to store offsets of thread and context static fields */
118         GHashTable         *special_static_fields;
119         GHashTable         *jump_target_hash;
120         MonoGHashTable     *class_init_trampoline_hash;
121         /* 
122          * This must be a GHashTable, since these objects can't be finalized
123          * if the hashtable contains a GC visible reference to them.
124          */
125         GHashTable         *finalizable_objects_hash;
126 };
127
128 /* This is a copy of System.AppDomain */
129 struct _MonoAppDomain {
130         MonoMarshalByRefObject mbr;
131         MonoDomain *data;
132 };
133
134 extern MonoDomain *mono_root_domain;
135
136 extern HANDLE mono_delegate_semaphore;
137 extern CRITICAL_SECTION mono_delegate_section;
138
139 #define mono_domain_lock(domain)   EnterCriticalSection(&(domain)->lock)
140 #define mono_domain_unlock(domain) LeaveCriticalSection(&(domain)->lock)
141
142 typedef void (*MonoDomainFunc) (MonoDomain *domain, gpointer user_data);
143
144 MonoDomain*
145 mono_init                  (const char *filename);
146
147 void
148 mono_runtime_init          (MonoDomain *domain, MonoThreadStartCB start_cb,
149                             MonoThreadAttachCB attach_cb);
150
151 void
152 mono_runtime_cleanup       (MonoDomain *domain);
153
154 void
155 mono_runtime_install_cleanup (MonoDomainFunc func);
156
157 void
158 mono_runtime_quit (void);
159
160 gboolean
161 mono_runtime_is_shutting_down (void);
162
163 const char*
164 mono_check_corlib_version (void);
165
166 MonoDomain *
167 mono_domain_create         (void);
168
169 inline MonoDomain *
170 mono_domain_get            (void);
171
172 inline MonoDomain *
173 mono_domain_get_by_id      (gint32 domainid);
174
175 inline gboolean
176 mono_domain_set            (MonoDomain *domain, gboolean force);
177
178 inline void
179 mono_domain_set_internal   (MonoDomain *domain);
180
181 gboolean
182 mono_domain_is_unloading   (MonoDomain *domain);
183
184 void
185 mono_domain_foreach        (MonoDomainFunc func, gpointer user_data);
186
187 MonoAssembly *
188 mono_domain_assembly_open  (MonoDomain *domain, const char *name);
189
190 gboolean
191 mono_domain_finalize       (MonoDomain *domain, guint32 timeout);
192
193 void
194 mono_domain_free           (MonoDomain *domain, gboolean force);
195
196 gboolean
197 mono_domain_has_type_resolve (MonoDomain *domain);
198
199 MonoReflectionAssembly *
200 mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb);
201
202 void
203 mono_jit_info_table_add    (MonoDomain *domain, MonoJitInfo *ji);
204
205 MonoJitInfo *
206 mono_jit_info_table_find   (MonoDomain *domain, char *addr);
207
208 void
209 ves_icall_System_AppDomainSetup_InitAppDomainSetup (MonoAppDomainSetup *setup);
210
211 MonoAppDomain *
212 ves_icall_System_AppDomain_getCurDomain            (void);
213
214 MonoAppDomain *
215 ves_icall_System_AppDomain_createDomain            (MonoString         *friendly_name,
216                                                     MonoAppDomainSetup *setup);
217
218 MonoObject *
219 ves_icall_System_AppDomain_GetData                 (MonoAppDomain *ad, 
220                                                     MonoString    *name);
221
222 MonoReflectionAssembly *
223 ves_icall_System_AppDomain_LoadAssemblyRaw         (MonoAppDomain *ad,
224                                                     MonoArray *raw_assembly, 
225                                                     MonoArray *raw_symbol_store,
226                                                     MonoObject *evidence);
227
228 void
229 ves_icall_System_AppDomain_SetData                 (MonoAppDomain *ad, 
230                                                     MonoString    *name, 
231                                                     MonoObject    *data);
232
233 MonoAppDomainSetup *
234 ves_icall_System_AppDomain_getSetup                (MonoAppDomain *ad);
235
236 MonoString *
237 ves_icall_System_AppDomain_getFriendlyName         (MonoAppDomain *ad);
238
239 MonoArray *
240 ves_icall_System_AppDomain_GetAssemblies           (MonoAppDomain *ad);
241
242 MonoReflectionAssembly *
243 ves_icall_System_Reflection_Assembly_LoadFrom      (MonoString *fname);
244
245 MonoReflectionAssembly *
246 ves_icall_System_AppDomain_LoadAssembly            (MonoAppDomain *ad, 
247                                                     MonoString *assRef,
248                                                     MonoObject    *evidence);
249
250 gboolean
251 ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id);
252
253 void
254 ves_icall_System_AppDomain_InternalUnload          (gint32 domain_id);
255
256 gint32
257 ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomain *ad, 
258                                                     MonoString    *file, 
259                                                     MonoObject    *evidence,
260                                                     MonoArray     *args);
261
262 void
263 mono_context_init                                  (MonoDomain *domain);
264
265 inline void 
266 mono_context_set                                   (MonoAppContext *new_context);
267
268 inline MonoAppContext * 
269 mono_context_get                                   (void);
270
271 MonoAppDomain * 
272 ves_icall_System_AppDomain_InternalSetDomain       (MonoAppDomain *ad);
273
274 MonoAppDomain * 
275 ves_icall_System_AppDomain_InternalSetDomainByID   (gint32 domainid);
276
277 void
278 ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomain *ad);
279
280 void
281 ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id);
282
283 void
284 ves_icall_System_AppDomain_InternalPopDomainRef (void);
285
286 MonoAppContext * 
287 ves_icall_System_AppDomain_InternalGetContext      (void);
288
289 MonoAppContext * 
290 ves_icall_System_AppDomain_InternalGetDefaultContext      (void);
291
292 MonoAppContext * 
293 ves_icall_System_AppDomain_InternalSetContext      (MonoAppContext *mc);
294
295 gint32 
296 ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad);
297
298 MonoString *
299 ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid);
300
301
302 #endif /* _MONO_METADATA_APPDOMAIN_H_ */