ea95d8efdf977a2aa5462e88980d27cf17f4a1ce
[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 } MonoAppDomainSetup;
41
42 typedef GArray MonoJitInfoTable;
43
44 typedef struct {
45         guint32  flags;
46         gpointer try_start;
47         gpointer try_end;
48         gpointer handler_start;
49         union {
50                 guint32 token;
51                 gpointer filter;
52         } data;
53 } MonoJitExceptionInfo;
54
55 typedef struct {
56         MonoMethod *method;
57         gpointer    code_start;
58         int         code_size;
59         guint32     used_regs;
60         unsigned    num_clauses;
61         signed      exvar_offset;
62         /* Whenever the code is domain neutral or 'shared' */
63         gboolean    domain_neutral:1;
64         MonoJitExceptionInfo *clauses;
65 } MonoJitInfo;
66
67 typedef struct {
68         MonoObject obj;
69         gint32 domain_id;
70         gint32 context_id;
71 } MonoAppContext;
72
73 typedef struct _MonoAppDomain MonoAppDomain;
74
75 struct _MonoDomain {
76         MonoAppDomain      *domain;
77         CRITICAL_SECTION    lock;
78         MonoMemPool        *mp;
79         MonoMemPool        *code_mp;
80         MonoGHashTable     *env;
81         GHashTable         *assemblies;
82         MonoAssembly       *entry_assembly;
83         MonoAppDomainSetup *setup;
84         char               *friendly_name;
85         MonoGHashTable     *ldstr_table;
86         MonoGHashTable     *class_vtable_hash;
87         MonoGHashTable     *proxy_vtable_hash;
88         MonoGHashTable     *static_data_hash;
89         GHashTable         *jit_code_hash;
90         MonoJitInfoTable   *jit_info_table;
91         /* hashtables for Reflection handles */
92         MonoGHashTable     *type_hash;
93         MonoGHashTable     *refobject_hash;
94         /* Needed by Thread:GetDomainID() */
95         gint32             domain_id;
96         /* Used when loading assemblies */
97         gchar **search_path;
98         /* Used by remoting proxies */
99         MonoMethod         *create_proxy_for_type_method;
100         MonoMethod         *private_invoke_method;
101         MonoAppContext     *default_context;
102         GHashTable         *thread_static_fields;
103         GHashTable         *jump_target_hash;
104 };
105
106 /* This is a copy of System.AppDomain */
107 struct _MonoAppDomain {
108         MonoMarshalByRefObject mbr;
109         MonoDomain *data;
110 };
111
112 extern MonoDomain *mono_root_domain;
113
114 extern HANDLE mono_delegate_semaphore;
115 extern CRITICAL_SECTION mono_delegate_section;
116
117 #define mono_domain_lock(domain)   EnterCriticalSection(&(domain)->lock)
118 #define mono_domain_unlock(domain) LeaveCriticalSection(&(domain)->lock)
119
120 typedef void (*MonoDomainFunc) (MonoDomain *domain, gpointer user_data);
121
122 MonoDomain*
123 mono_init                  (const char *filename);
124
125 void
126 mono_runtime_init          (MonoDomain *domain, MonoThreadStartCB start_cb,
127                             MonoThreadAttachCB attach_cb);
128
129 void
130 mono_runtime_cleanup       (MonoDomain *domain);
131
132 void
133 mono_runtime_install_cleanup (MonoDomainFunc func);
134
135 void
136 mono_runtime_quit (void);
137
138 MonoDomain *
139 mono_domain_create         (void);
140
141 inline MonoDomain *
142 mono_domain_get            (void);
143
144 inline MonoDomain *
145 mono_domain_get_by_id      (gint32 domainid);
146
147 inline void
148 mono_domain_set            (MonoDomain *domain);
149
150 void
151 mono_domain_foreach        (MonoDomainFunc func, gpointer user_data);
152
153 MonoAssembly *
154 mono_domain_assembly_open  (MonoDomain *domain, const char *name);
155
156 void
157 mono_domain_finalize       (MonoDomain *domain);
158
159 void
160 mono_domain_unload         (MonoDomain *domain, gboolean force);
161
162 gboolean
163 mono_domain_has_type_resolve (MonoDomain *domain);
164
165 MonoReflectionAssembly *
166 mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb);
167
168 void
169 mono_jit_info_table_add    (MonoDomain *domain, MonoJitInfo *ji);
170
171 MonoJitInfo *
172 mono_jit_info_table_find   (MonoDomain *domain, char *addr);
173
174 void
175 ves_icall_System_AppDomainSetup_InitAppDomainSetup (MonoAppDomainSetup *setup);
176
177 MonoAppDomain *
178 ves_icall_System_AppDomain_getCurDomain            (void);
179
180 MonoAppDomain *
181 ves_icall_System_AppDomain_createDomain            (MonoString         *friendly_name,
182                                                     MonoAppDomainSetup *setup);
183
184 MonoObject *
185 ves_icall_System_AppDomain_GetData                 (MonoAppDomain *ad, 
186                                                     MonoString    *name);
187
188 void
189 ves_icall_System_AppDomain_SetData                 (MonoAppDomain *ad, 
190                                                     MonoString    *name, 
191                                                     MonoObject    *data);
192
193 MonoAppDomainSetup *
194 ves_icall_System_AppDomain_getSetup                (MonoAppDomain *ad);
195
196 MonoString *
197 ves_icall_System_AppDomain_getFriendlyName         (MonoAppDomain *ad);
198
199 MonoArray *
200 ves_icall_System_AppDomain_GetAssemblies           (MonoAppDomain *ad);
201
202 MonoReflectionAssembly *
203 ves_icall_System_Reflection_Assembly_LoadFrom      (MonoString *fname);
204
205 MonoReflectionAssembly *
206 ves_icall_System_AppDomain_LoadAssembly            (MonoAppDomain *ad, 
207                                                     MonoReflectionAssemblyName *assRef,
208                                                     MonoObject    *evidence);
209
210 void
211 ves_icall_System_AppDomain_InternalUnload          (gint32 domain_id);
212
213 gint32
214 ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomain *ad, 
215                                                     MonoString    *file, 
216                                                     MonoObject    *evidence,
217                                                     MonoArray     *args);
218
219 void
220 mono_context_init                                  (MonoDomain *domain);
221
222 inline void 
223 mono_context_set                                   (MonoAppContext *new_context);
224
225 inline MonoAppContext * 
226 mono_context_get                                   (void);
227
228 MonoAppDomain * 
229 ves_icall_System_AppDomain_InternalSetDomain       (MonoAppDomain *ad);
230
231 MonoAppDomain * 
232 ves_icall_System_AppDomain_InternalSetDomainByID   (gint32 domainid);
233
234 MonoAppContext * 
235 ves_icall_System_AppDomain_InternalGetContext      (void);
236
237 MonoAppContext * 
238 ves_icall_System_AppDomain_InternalGetDefaultContext      (void);
239
240 MonoAppContext * 
241 ves_icall_System_AppDomain_InternalSetContext      (MonoAppContext *mc);
242
243 gint32 
244 ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad);
245
246 MonoString *
247 ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid);
248
249
250 #endif /* _MONO_METADATA_APPDOMAIN_H_ */