X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fdomain-internals.h;h=37402a55abe059731209345efb67bc12d2e19503;hb=ef839470ee9e5a5a98980aa80f29ec99428692d9;hp=7044761760284fd2148ed8e82aabfe11bdf99025;hpb=b7c17c47e6b3c02192e64175cb5ee0ce7f7dda1b;p=mono.git diff --git a/mono/metadata/domain-internals.h b/mono/metadata/domain-internals.h index 70447617602..37402a55abe 100644 --- a/mono/metadata/domain-internals.h +++ b/mono/metadata/domain-internals.h @@ -7,6 +7,7 @@ #include #include #include +#include #include extern CRITICAL_SECTION mono_delegate_section; @@ -35,11 +36,12 @@ typedef GArray MonoJitInfoTable; typedef struct { guint32 flags; + gint32 exvar_offset; gpointer try_start; gpointer try_end; gpointer handler_start; union { - guint32 token; + MonoClass *catch_class; gpointer filter; } data; } MonoJitExceptionInfo; @@ -47,15 +49,26 @@ typedef struct { struct _MonoJitInfo { MonoMethod *method; gpointer code_start; - int code_size; guint32 used_regs; - unsigned num_clauses; - signed exvar_offset; + int code_size; + guint32 num_clauses:24; /* Whenever the code is domain neutral or 'shared' */ gboolean domain_neutral:1; - MonoJitExceptionInfo *clauses; + gboolean cas_inited:1; + gboolean cas_class_assert:1; + gboolean cas_class_deny:1; + gboolean cas_class_permitonly:1; + gboolean cas_method_assert:1; + gboolean cas_method_deny:1; + gboolean cas_method_permitonly:1; + MonoJitExceptionInfo clauses [MONO_ZERO_LEN_ARRAY]; }; +typedef struct { + MonoJitInfo *ji; + MonoCodeManager *code_mp; +} MonoJitDynamicMethodInfo; + struct _MonoAppContext { MonoObject obj; gint32 domain_id; @@ -70,132 +83,203 @@ typedef enum { } MonoAppDomainState; struct _MonoDomain { - MonoAppDomain *domain; CRITICAL_SECTION lock; MonoMemPool *mp; MonoCodeManager *code_mp; - MonoGHashTable *env; - GHashTable *assemblies; - MonoAssembly *entry_assembly; + /* + * keep all the managed objects close to each other for the precise GC + * For the Boehm GC we additionally keep close also other GC-tracked pointers. + */ +#define MONO_DOMAIN_FIRST_OBJECT setup MonoAppDomainSetup *setup; - char *friendly_name; - guint32 state; + MonoAppDomain *domain; + MonoAppContext *default_context; + MonoException *out_of_memory_ex; + MonoException *null_reference_ex; + MonoException *stack_overflow_ex; +#define MONO_DOMAIN_FIRST_GC_TRACKED env + MonoGHashTable *env; MonoGHashTable *ldstr_table; - MonoGHashTable *class_vtable_hash; - MonoGHashTable *proxy_vtable_hash; - MonoGHashTable *static_data_hash; - GHashTable *jit_code_hash; - MonoJitInfoTable *jit_info_table; /* hashtables for Reflection handles */ MonoGHashTable *type_hash; MonoGHashTable *refobject_hash; + /* a GC-tracked array to keep references to the static fields of types */ + gpointer *static_data_array; + /* maps class -> type initialization exception object */ + MonoGHashTable *type_init_exception_hash; + /* maps delegate trampoline addr -> delegate object */ + MonoGHashTable *delegate_hash_table; +#define MONO_DOMAIN_LAST_GC_TRACKED delegate_hash_table + guint32 state; /* Needed by Thread:GetDomainID() */ gint32 domain_id; + GSList *domain_assemblies; + MonoAssembly *entry_assembly; + char *friendly_name; + GHashTable *class_vtable_hash; + /* maps remote class key -> MonoRemoteClass */ + GHashTable *proxy_vtable_hash; + GHashTable *jit_code_hash; + /* maps MonoMethod -> MonoJitDynamicMethodInfo */ + GHashTable *dynamic_code_hash; + MonoJitInfoTable *jit_info_table; /* Used when loading assemblies */ gchar **search_path; /* Used by remoting proxies */ MonoMethod *create_proxy_for_type_method; MonoMethod *private_invoke_method; - MonoAppContext *default_context; - MonoException *out_of_memory_ex; - MonoException *null_reference_ex; - MonoException *stack_overflow_ex; /* Used to store offsets of thread and context static fields */ GHashTable *special_static_fields; GHashTable *jump_target_hash; - MonoGHashTable *class_init_trampoline_hash; + GHashTable *class_init_trampoline_hash; + GHashTable *jump_trampoline_hash; + GHashTable *jit_trampoline_hash; + GHashTable *delegate_trampoline_hash; /* * This must be a GHashTable, since these objects can't be finalized * if the hashtable contains a GC visible reference to them. */ GHashTable *finalizable_objects_hash; + /* Used when accessing 'domain_assemblies' */ + CRITICAL_SECTION assemblies_lock; }; +typedef struct { + guint16 major, minor, build, revision; +} AssemblyVersionSet; + +/* MonoRuntimeInfo: Contains information about versions supported by this runtime */ +typedef struct { + const char runtime_version [12]; + const char framework_version [4]; + const AssemblyVersionSet version_sets [2]; +} MonoRuntimeInfo; + #define mono_domain_lock(domain) EnterCriticalSection(&(domain)->lock) #define mono_domain_unlock(domain) LeaveCriticalSection(&(domain)->lock) +#define mono_domain_assemblies_lock(domain) EnterCriticalSection(&(domain)->assemblies_lock) +#define mono_domain_assemblies_unlock(domain) LeaveCriticalSection(&(domain)->assemblies_lock) + +void +mono_cleanup (void) MONO_INTERNAL; void -mono_jit_info_table_add (MonoDomain *domain, MonoJitInfo *ji); +mono_jit_info_table_add (MonoDomain *domain, MonoJitInfo *ji) MONO_INTERNAL; + +void +mono_jit_info_table_remove (MonoDomain *domain, MonoJitInfo *ji) MONO_INTERNAL; + +void +mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end) MONO_INTERNAL; + +/* + * Installs a new function which is used to return a MonoJitInfo for a method inside + * an AOT module. + */ +typedef MonoJitInfo *(*MonoJitInfoFindInAot) (MonoDomain *domain, MonoImage *image, gpointer addr); +void mono_install_jit_info_find_in_aot (MonoJitInfoFindInAot func) MONO_INTERNAL; MonoAppDomain * -ves_icall_System_AppDomain_getCurDomain (void); +ves_icall_System_AppDomain_getCurDomain (void) MONO_INTERNAL; + +MonoAppDomain * +ves_icall_System_AppDomain_getRootDomain (void) MONO_INTERNAL; MonoAppDomain * ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, - MonoAppDomainSetup *setup); + MonoAppDomainSetup *setup) MONO_INTERNAL; MonoObject * ves_icall_System_AppDomain_GetData (MonoAppDomain *ad, - MonoString *name); + MonoString *name) MONO_INTERNAL; MonoReflectionAssembly * ves_icall_System_AppDomain_LoadAssemblyRaw (MonoAppDomain *ad, MonoArray *raw_assembly, MonoArray *raw_symbol_store, - MonoObject *evidence); + MonoObject *evidence, + MonoBoolean refonly) MONO_INTERNAL; void ves_icall_System_AppDomain_SetData (MonoAppDomain *ad, MonoString *name, - MonoObject *data); + MonoObject *data) MONO_INTERNAL; MonoAppDomainSetup * -ves_icall_System_AppDomain_getSetup (MonoAppDomain *ad); +ves_icall_System_AppDomain_getSetup (MonoAppDomain *ad) MONO_INTERNAL; MonoString * -ves_icall_System_AppDomain_getFriendlyName (MonoAppDomain *ad); +ves_icall_System_AppDomain_getFriendlyName (MonoAppDomain *ad) MONO_INTERNAL; MonoArray * -ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad); +ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad, + MonoBoolean refonly) MONO_INTERNAL; MonoReflectionAssembly * -ves_icall_System_Reflection_Assembly_LoadFrom (MonoString *fname); +ves_icall_System_Reflection_Assembly_LoadFrom (MonoString *fname, + MonoBoolean refonly) MONO_INTERNAL; MonoReflectionAssembly * ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad, MonoString *assRef, - MonoObject *evidence); + MonoObject *evidence, + MonoBoolean refonly) MONO_INTERNAL; gboolean -ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id); +ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id) MONO_INTERNAL; void -ves_icall_System_AppDomain_InternalUnload (gint32 domain_id); +ves_icall_System_AppDomain_InternalUnload (gint32 domain_id) MONO_INTERNAL; gint32 ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, MonoString *file, MonoObject *evidence, - MonoArray *args); + MonoArray *args) MONO_INTERNAL; MonoAppDomain * -ves_icall_System_AppDomain_InternalSetDomain (MonoAppDomain *ad); +ves_icall_System_AppDomain_InternalSetDomain (MonoAppDomain *ad) MONO_INTERNAL; MonoAppDomain * -ves_icall_System_AppDomain_InternalSetDomainByID (gint32 domainid); +ves_icall_System_AppDomain_InternalSetDomainByID (gint32 domainid) MONO_INTERNAL; void -ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomain *ad); +ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomain *ad) MONO_INTERNAL; void -ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id); +ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id) MONO_INTERNAL; void -ves_icall_System_AppDomain_InternalPopDomainRef (void); +ves_icall_System_AppDomain_InternalPopDomainRef (void) MONO_INTERNAL; MonoAppContext * -ves_icall_System_AppDomain_InternalGetContext (void); +ves_icall_System_AppDomain_InternalGetContext (void) MONO_INTERNAL; MonoAppContext * -ves_icall_System_AppDomain_InternalGetDefaultContext (void); +ves_icall_System_AppDomain_InternalGetDefaultContext (void) MONO_INTERNAL; MonoAppContext * -ves_icall_System_AppDomain_InternalSetContext (MonoAppContext *mc); +ves_icall_System_AppDomain_InternalSetContext (MonoAppContext *mc) MONO_INTERNAL; gint32 -ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad); +ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad) MONO_INTERNAL; MonoString * -ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid); +ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid) MONO_INTERNAL; + +MonoAssembly * +mono_assembly_load_corlib (const MonoRuntimeInfo *runtime, MonoImageOpenStatus *status) MONO_INTERNAL; + +const MonoRuntimeInfo* +mono_get_runtime_info (void) MONO_INTERNAL; + +gboolean +mono_assembly_name_parse (const char *name, MonoAssemblyName *aname) MONO_INTERNAL; + +void +mono_assembly_name_free (MonoAssemblyName *aname) MONO_INTERNAL; + +void +mono_domain_add_class_static_data (MonoDomain *domain, MonoClass *klass, gpointer data, guint32 *bitmap); #endif /* __MONO_METADATA_DOMAIN_INTERNALS_H__ */