This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[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         gpointer try_start;
39         gpointer try_end;
40         gpointer handler_start;
41         union {
42                 guint32 token;
43                 gpointer filter;
44         } data;
45 } MonoJitExceptionInfo;
46
47 struct _MonoJitInfo {
48         MonoMethod *method;
49         gpointer    code_start;
50         int         code_size;
51         guint32     used_regs;
52         unsigned    num_clauses;
53         signed      exvar_offset;
54         /* Whenever the code is domain neutral or 'shared' */
55         gboolean    domain_neutral:1;
56         MonoJitExceptionInfo *clauses;
57 };
58
59 struct _MonoAppContext {
60         MonoObject obj;
61         gint32 domain_id;
62         gint32 context_id;
63         gpointer *static_data;
64 };
65
66 typedef enum {
67         MONO_APPDOMAIN_CREATED,
68         MONO_APPDOMAIN_UNLOADING,
69         MONO_APPDOMAIN_UNLOADED
70 } MonoAppDomainState;
71
72 struct _MonoDomain {
73         MonoAppDomain      *domain;
74         CRITICAL_SECTION    lock;
75         MonoMemPool        *mp;
76         MonoCodeManager    *code_mp;
77         MonoGHashTable     *env;
78         GHashTable         *assemblies;
79         MonoAssembly       *entry_assembly;
80         MonoAppDomainSetup *setup;
81         char               *friendly_name;
82         guint32            state;
83         MonoGHashTable     *ldstr_table;
84         MonoGHashTable     *class_vtable_hash;
85         MonoGHashTable     *proxy_vtable_hash;
86         MonoGHashTable     *static_data_hash;
87         GHashTable         *jit_code_hash;
88         MonoJitInfoTable   *jit_info_table;
89         /* hashtables for Reflection handles */
90         MonoGHashTable     *type_hash;
91         MonoGHashTable     *refobject_hash;
92         /* Needed by Thread:GetDomainID() */
93         gint32             domain_id;
94         /* Used when loading assemblies */
95         gchar **search_path;
96         /* Used by remoting proxies */
97         MonoMethod         *create_proxy_for_type_method;
98         MonoMethod         *private_invoke_method;
99         MonoAppContext     *default_context;
100         MonoException      *out_of_memory_ex;
101         MonoException      *null_reference_ex;
102         MonoException      *stack_overflow_ex;
103         /* Used to store offsets of thread and context static fields */
104         GHashTable         *special_static_fields;
105         GHashTable         *jump_target_hash;
106         MonoGHashTable     *class_init_trampoline_hash;
107         /* 
108          * This must be a GHashTable, since these objects can't be finalized
109          * if the hashtable contains a GC visible reference to them.
110          */
111         GHashTable         *finalizable_objects_hash;
112 };
113
114 #define mono_domain_lock(domain)   EnterCriticalSection(&(domain)->lock)
115 #define mono_domain_unlock(domain) LeaveCriticalSection(&(domain)->lock)
116
117 void
118 mono_jit_info_table_add    (MonoDomain *domain, MonoJitInfo *ji);
119
120 MonoAppDomain *
121 ves_icall_System_AppDomain_getCurDomain            (void);
122
123 MonoAppDomain *
124 ves_icall_System_AppDomain_createDomain            (MonoString         *friendly_name,
125                                                     MonoAppDomainSetup *setup);
126
127 MonoObject *
128 ves_icall_System_AppDomain_GetData                 (MonoAppDomain *ad, 
129                                                     MonoString    *name);
130
131 MonoReflectionAssembly *
132 ves_icall_System_AppDomain_LoadAssemblyRaw         (MonoAppDomain *ad,
133                                                     MonoArray *raw_assembly, 
134                                                     MonoArray *raw_symbol_store,
135                                                     MonoObject *evidence);
136
137 void
138 ves_icall_System_AppDomain_SetData                 (MonoAppDomain *ad, 
139                                                     MonoString    *name, 
140                                                     MonoObject    *data);
141
142 MonoAppDomainSetup *
143 ves_icall_System_AppDomain_getSetup                (MonoAppDomain *ad);
144
145 MonoString *
146 ves_icall_System_AppDomain_getFriendlyName         (MonoAppDomain *ad);
147
148 MonoArray *
149 ves_icall_System_AppDomain_GetAssemblies           (MonoAppDomain *ad);
150
151 MonoReflectionAssembly *
152 ves_icall_System_Reflection_Assembly_LoadFrom      (MonoString *fname);
153
154 MonoReflectionAssembly *
155 ves_icall_System_AppDomain_LoadAssembly            (MonoAppDomain *ad, 
156                                                     MonoString *assRef,
157                                                     MonoObject    *evidence);
158
159 gboolean
160 ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id);
161
162 void
163 ves_icall_System_AppDomain_InternalUnload          (gint32 domain_id);
164
165 gint32
166 ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomain *ad, 
167                                                     MonoString    *file, 
168                                                     MonoObject    *evidence,
169                                                     MonoArray     *args);
170
171 MonoAppDomain * 
172 ves_icall_System_AppDomain_InternalSetDomain       (MonoAppDomain *ad);
173
174 MonoAppDomain * 
175 ves_icall_System_AppDomain_InternalSetDomainByID   (gint32 domainid);
176
177 void
178 ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomain *ad);
179
180 void
181 ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id);
182
183 void
184 ves_icall_System_AppDomain_InternalPopDomainRef (void);
185
186 MonoAppContext * 
187 ves_icall_System_AppDomain_InternalGetContext      (void);
188
189 MonoAppContext * 
190 ves_icall_System_AppDomain_InternalGetDefaultContext      (void);
191
192 MonoAppContext * 
193 ves_icall_System_AppDomain_InternalSetContext      (MonoAppContext *mc);
194
195 gint32 
196 ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad);
197
198 MonoString *
199 ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid);
200
201 #endif /* __MONO_METADATA_DOMAIN_INTERNALS_H__ */