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