2008-10-01 Mark Probst <mark.probst@gmail.com>
[mono.git] / mono / metadata / domain.c
index bdfd0be32eb19d31560fd02169a74f1d7ccb4eb6..ea3e19c272f18aadaaece22b2aaf83a6c2da8d2f 100644 (file)
@@ -122,6 +122,10 @@ static const MonoRuntimeInfo supported_runtimes[] = {
 /* The stable runtime version */
 #define DEFAULT_RUNTIME_VERSION "v1.1.4322"
 
+/* Callbacks installed by the JIT */
+static MonoCreateDomainFunc create_domain_hook;
+static MonoFreeDomainFunc free_domain_hook;
+
 /* This is intentionally not in the header file, so people don't misuse it. */
 extern void _mono_debug_init_corlib (MonoDomain *domain);
 
@@ -398,13 +402,14 @@ mono_jit_info_table_find (MonoDomain *domain, char *addr)
                           beyond what we're looking for, we have to end the
                           search. */
                        if ((gint8*)addr < (gint8*)ji->code_start)
-                               break;
+                               goto not_found;
                }
 
                ++chunk_pos;
                pos = 0;
-        } while (chunk_pos < table->num_chunks);
+       } while (chunk_pos < table->num_chunks);
 
+ not_found:
        mono_hazard_pointer_clear (hp, JIT_INFO_TABLE_HAZARD_INDEX);
        mono_hazard_pointer_clear (hp, JIT_INFO_HAZARD_INDEX);
 
@@ -997,6 +1002,18 @@ mono_jit_info_set_generic_sharing_context (MonoJitInfo *ji, MonoGenericSharingCo
 
        gi->generic_sharing_context = gsctx;
 }
+void
+mono_install_create_domain_hook (MonoCreateDomainFunc func)
+{
+       create_domain_hook = func;
+}
+
+void
+mono_install_free_domain_hook (MonoFreeDomainFunc func)
+{
+       free_domain_hook = func;
+}
 
 /**
  * mono_string_equal:
@@ -1157,14 +1174,11 @@ mono_domain_create (void)
        domain->num_jit_info_tables = 1;
        domain->jit_info_table = jit_info_table_new (domain);
        domain->jit_info_free_queue = NULL;
-       domain->class_init_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
-       domain->jump_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
        domain->finalizable_objects_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
-       domain->jit_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
-       domain->delegate_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
 
        InitializeCriticalSection (&domain->lock);
        InitializeCriticalSection (&domain->assemblies_lock);
+       InitializeCriticalSection (&domain->jit_code_hash_lock);
 
        domain->shared_generics_hash = NULL;
        domain->method_rgctx_hash = NULL;
@@ -1173,8 +1187,14 @@ mono_domain_create (void)
        domain_id_alloc (domain);
        mono_appdomains_unlock ();
 
+       mono_perfcounters->loader_appdomains++;
+       mono_perfcounters->loader_total_appdomains++;
+
        mono_debug_domain_create (domain);
 
+       if (create_domain_hook)
+               create_domain_hook (domain);
+
        mono_profiler_appdomain_loaded (domain, MONO_PROFILE_OK);
        
        return domain;
@@ -1795,20 +1815,6 @@ mono_domain_register_shared_generic (MonoDomain *domain, MonoMethod *method, Mon
        g_hash_table_insert (domain->shared_generics_hash, method, jit_info);
 }
 
-static void
-dynamic_method_info_free (gpointer key, gpointer value, gpointer user_data)
-{
-       MonoJitDynamicMethodInfo *di = value;
-       mono_code_manager_destroy (di->code_mp);
-       g_free (di);
-}
-
-static void
-delete_jump_list (gpointer key, gpointer value, gpointer user_data)
-{
-       g_slist_free (value);
-}
-
 void
 mono_domain_free (MonoDomain *domain, gboolean force)
 {
@@ -1824,6 +1830,9 @@ mono_domain_free (MonoDomain *domain, gboolean force)
 
        mono_profiler_appdomain_event (domain, MONO_PROFILE_START_UNLOAD);
 
+       if (free_domain_hook)
+               free_domain_hook (domain);
+
        mono_debug_domain_unload (domain);
 
        mono_appdomains_lock ();
@@ -1869,11 +1878,6 @@ mono_domain_free (MonoDomain *domain, gboolean force)
                domain->static_data_array = NULL;
        }
        mono_internal_hash_table_destroy (&domain->jit_code_hash);
-       if (domain->dynamic_code_hash) {
-               g_hash_table_foreach (domain->dynamic_code_hash, dynamic_method_info_free, NULL);
-               g_hash_table_destroy (domain->dynamic_code_hash);
-               domain->dynamic_code_hash = NULL;
-       }
        mono_g_hash_table_destroy (domain->ldstr_table);
        domain->ldstr_table = NULL;
 
@@ -1898,16 +1902,12 @@ mono_domain_free (MonoDomain *domain, gboolean force)
        mono_mempool_invalidate (domain->mp);
        mono_code_manager_invalidate (domain->code_mp);
 #else
+       mono_perfcounters->loader_bytes -= mono_mempool_get_allocated (domain->mp);
        mono_mempool_destroy (domain->mp);
        domain->mp = NULL;
        mono_code_manager_destroy (domain->code_mp);
        domain->code_mp = NULL;
 #endif 
-       if (domain->jump_target_hash) {
-               g_hash_table_foreach (domain->jump_target_hash, delete_jump_list, NULL);
-               g_hash_table_destroy (domain->jump_target_hash);
-               domain->jump_target_hash = NULL;
-       }
        if (domain->type_hash) {
                mono_g_hash_table_destroy (domain->type_hash);
                domain->type_hash = NULL;
@@ -1920,16 +1920,8 @@ mono_domain_free (MonoDomain *domain, gboolean force)
                mono_g_hash_table_destroy (domain->type_init_exception_hash);
                domain->type_init_exception_hash = NULL;
        }
-       g_hash_table_destroy (domain->class_init_trampoline_hash);
-       domain->class_init_trampoline_hash = NULL;
-       g_hash_table_destroy (domain->jump_trampoline_hash);
-       domain->jump_trampoline_hash = NULL;
        g_hash_table_destroy (domain->finalizable_objects_hash);
        domain->finalizable_objects_hash = NULL;
-       g_hash_table_destroy (domain->jit_trampoline_hash);
-       domain->jit_trampoline_hash = NULL;
-       g_hash_table_destroy (domain->delegate_trampoline_hash);
-       domain->delegate_trampoline_hash = NULL;
        if (domain->shared_generics_hash) {
                g_hash_table_destroy (domain->shared_generics_hash);
                domain->shared_generics_hash = NULL;
@@ -1938,8 +1930,13 @@ mono_domain_free (MonoDomain *domain, gboolean force)
                g_hash_table_destroy (domain->method_rgctx_hash);
                domain->method_rgctx_hash = NULL;
        }
+       if (domain->generic_virtual_cases) {
+               g_hash_table_destroy (domain->generic_virtual_cases);
+               domain->generic_virtual_cases = NULL;
+       }
 
        DeleteCriticalSection (&domain->assemblies_lock);
+       DeleteCriticalSection (&domain->jit_code_hash_lock);
        DeleteCriticalSection (&domain->lock);
        domain->setup = NULL;
 
@@ -1949,6 +1946,8 @@ mono_domain_free (MonoDomain *domain, gboolean force)
 
        mono_gc_free_fixed (domain);
 
+       mono_perfcounters->loader_appdomains--;
+
        if ((domain == mono_root_domain))
                mono_root_domain = NULL;
 }
@@ -1980,6 +1979,20 @@ mono_domain_get_id (MonoDomain *domain)
        return domain->domain_id;
 }
 
+gpointer
+mono_domain_alloc (MonoDomain *domain, guint size)
+{
+       mono_perfcounters->loader_bytes += size;
+       return mono_mempool_alloc (domain->mp, size);
+}
+
+gpointer
+mono_domain_alloc0 (MonoDomain *domain, guint size)
+{
+       mono_perfcounters->loader_bytes += size;
+       return mono_mempool_alloc0 (domain->mp, size);
+}
+
 void 
 mono_context_set (MonoAppContext * new_context)
 {