2004-01-19 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / metadata / appdomain.h
index 3cdd20f4fae862be3247eaf036525f2036958977..45b8a3195bec27b40898867b750a5834cf794918 100644 (file)
 #ifndef _MONO_METADATA_APPDOMAIN_H_
 #define _MONO_METADATA_APPDOMAIN_H_
 
-#include <config.h>
 #include <glib.h>
 
 #include <mono/metadata/object.h>
 #include <mono/metadata/reflection.h>
+#include <mono/metadata/mempool.h>
+#include <mono/utils/mono-hash.h>
+#include <mono/io-layer/io-layer.h>
+
+typedef void (*MonoThreadStartCB) (guint32 tid, gpointer stack_start,
+                                  gpointer func);
+typedef void (*MonoThreadAttachCB) (guint32 tid, gpointer stack_start);
 
 /* This is a copy of System.AppDomainSetup */
 typedef struct {
@@ -30,32 +36,171 @@ typedef struct {
        MonoString *shadow_copy_directories;
        MonoString *shadow_copy_files;
        MonoBoolean publisher_policy;
+       MonoBoolean path_changed;
+       int loader_optimization;
+       MonoBoolean disallow_binding_redirects;
+       MonoBoolean disallow_code_downloads;
 } MonoAppDomainSetup;
 
-typedef struct _MonoAppDomain MonoAppDomain;
+typedef GArray MonoJitInfoTable;
 
 typedef struct {
-       MonoAppDomain *domain;
-       GHashTable *env;
-       GHashTable *assemblies;
+       guint32  flags;
+       gpointer try_start;
+       gpointer try_end;
+       gpointer handler_start;
+       union {
+               guint32 token;
+               gpointer filter;
+       } data;
+} MonoJitExceptionInfo;
+
+typedef struct {
+       MonoMethod *method;
+       gpointer    code_start;
+       int         code_size;
+       guint32     used_regs;
+       unsigned    num_clauses;
+       signed      exvar_offset;
+       /* Whenever the code is domain neutral or 'shared' */
+       gboolean    domain_neutral:1;
+       MonoJitExceptionInfo *clauses;
+} MonoJitInfo;
+
+typedef struct {
+       MonoObject obj;
+       gint32 domain_id;
+       gint32 context_id;
+       gpointer *static_data;
+} MonoAppContext;
+
+typedef enum {
+       MONO_APPDOMAIN_CREATED,
+       MONO_APPDOMAIN_UNLOADING,
+       MONO_APPDOMAIN_UNLOADED
+} MonoAppDomainState;
+
+typedef struct _MonoAppDomain MonoAppDomain;
+
+struct _MonoDomain {
+       MonoAppDomain      *domain;
+       CRITICAL_SECTION    lock;
+       MonoMemPool        *mp;
+       MonoMemPool        *code_mp;
+       MonoGHashTable     *env;
+       GHashTable         *assemblies;
+       MonoAssembly       *entry_assembly;
        MonoAppDomainSetup *setup;
-       MonoString *friendly_name;
-} MonoAppDomainData;
+       char               *friendly_name;
+       guint32            state;
+       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;
+       /* Needed by Thread:GetDomainID() */
+       gint32             domain_id;
+       /* 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;
+       /* Used to store offsets of thread and context static fields */
+       GHashTable         *special_static_fields;
+       GHashTable         *jump_target_hash;
+       MonoGHashTable     *class_init_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;
+};
 
 /* This is a copy of System.AppDomain */
 struct _MonoAppDomain {
-       MonoObject object;
-       MonoAppDomainData *data;
+       MonoMarshalByRefObject mbr;
+       MonoDomain *data;
 };
 
+extern MonoDomain *mono_root_domain;
+
+extern HANDLE mono_delegate_semaphore;
+extern CRITICAL_SECTION mono_delegate_section;
+
+#define mono_domain_lock(domain)   EnterCriticalSection(&(domain)->lock)
+#define mono_domain_unlock(domain) LeaveCriticalSection(&(domain)->lock)
+
+typedef void (*MonoDomainFunc) (MonoDomain *domain, gpointer user_data);
+
+MonoDomain*
+mono_init                  (const char *filename);
+
 void
-mono_appdomain_init (char *friendly_name);
+mono_runtime_init          (MonoDomain *domain, MonoThreadStartCB start_cb,
+                           MonoThreadAttachCB attach_cb);
 
-inline MonoAppDomainData *
-mono_appdomain_get (void);
+void
+mono_runtime_cleanup       (MonoDomain *domain);
+
+void
+mono_runtime_install_cleanup (MonoDomainFunc func);
+
+void
+mono_runtime_quit (void);
+
+gboolean
+mono_runtime_is_shutting_down (void);
+
+const char*
+mono_check_corlib_version (void);
+
+MonoDomain *
+mono_domain_create         (void);
+
+inline MonoDomain *
+mono_domain_get            (void);
+
+inline MonoDomain *
+mono_domain_get_by_id      (gint32 domainid);
+
+inline gboolean
+mono_domain_set            (MonoDomain *domain, gboolean force);
 
 inline void
-mono_appdomain_set (MonoAppDomainData *domain);
+mono_domain_set_internal   (MonoDomain *domain);
+
+gboolean
+mono_domain_is_unloading   (MonoDomain *domain);
+
+void
+mono_domain_foreach        (MonoDomainFunc func, gpointer user_data);
+
+MonoAssembly *
+mono_domain_assembly_open  (MonoDomain *domain, const char *name);
+
+gboolean
+mono_domain_finalize       (MonoDomain *domain, guint32 timeout);
+
+void
+mono_domain_free           (MonoDomain *domain, gboolean force);
+
+gboolean
+mono_domain_has_type_resolve (MonoDomain *domain);
+
+MonoReflectionAssembly *
+mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb);
+
+void
+mono_jit_info_table_add    (MonoDomain *domain, MonoJitInfo *ji);
+
+MonoJitInfo *
+mono_jit_info_table_find   (MonoDomain *domain, char *addr);
 
 void
 ves_icall_System_AppDomainSetup_InitAppDomainSetup (MonoAppDomainSetup *setup);
@@ -71,6 +216,12 @@ MonoObject *
 ves_icall_System_AppDomain_GetData                 (MonoAppDomain *ad, 
                                                    MonoString    *name);
 
+MonoReflectionAssembly *
+ves_icall_System_AppDomain_LoadAssemblyRaw         (MonoAppDomain *ad,
+                                                   MonoArray *raw_assembly, 
+                                                   MonoArray *raw_symbol_store,
+                                                   MonoObject *evidence);
+
 void
 ves_icall_System_AppDomain_SetData                 (MonoAppDomain *ad, 
                                                    MonoString    *name, 
@@ -85,13 +236,19 @@ ves_icall_System_AppDomain_getFriendlyName         (MonoAppDomain *ad);
 MonoArray *
 ves_icall_System_AppDomain_GetAssemblies           (MonoAppDomain *ad);
 
+MonoReflectionAssembly *
+ves_icall_System_Reflection_Assembly_LoadFrom      (MonoString *fname);
+
 MonoReflectionAssembly *
 ves_icall_System_AppDomain_LoadAssembly            (MonoAppDomain *ad, 
-                                                   MonoReflectionAssemblyName *assRef,
+                                                   MonoString *assRef,
                                                    MonoObject    *evidence);
 
+gboolean
+ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id);
+
 void
-ves_icall_System_AppDomain_Unload                  (MonoAppDomain *ad);
+ves_icall_System_AppDomain_InternalUnload          (gint32 domain_id);
 
 gint32
 ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomain *ad, 
@@ -99,4 +256,44 @@ ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomain *ad,
                                                    MonoObject    *evidence,
                                                    MonoArray     *args);
 
+void
+mono_context_init                                 (MonoDomain *domain);
+
+inline void 
+mono_context_set                                  (MonoAppContext *new_context);
+
+inline MonoAppContext * 
+mono_context_get                                  (void);
+
+MonoAppDomain * 
+ves_icall_System_AppDomain_InternalSetDomain      (MonoAppDomain *ad);
+
+MonoAppDomain * 
+ves_icall_System_AppDomain_InternalSetDomainByID   (gint32 domainid);
+
+void
+ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomain *ad);
+
+void
+ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id);
+
+void
+ves_icall_System_AppDomain_InternalPopDomainRef (void);
+
+MonoAppContext * 
+ves_icall_System_AppDomain_InternalGetContext      (void);
+
+MonoAppContext * 
+ves_icall_System_AppDomain_InternalGetDefaultContext      (void);
+
+MonoAppContext * 
+ves_icall_System_AppDomain_InternalSetContext     (MonoAppContext *mc);
+
+gint32 
+ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad);
+
+MonoString *
+ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid);
+
+
 #endif /* _MONO_METADATA_APPDOMAIN_H_ */