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