2007-06-04 Mark Probst <mark.probst@gmail.com>
authorMark Probst <mark.probst@gmail.com>
Mon, 4 Jun 2007 20:49:21 +0000 (20:49 -0000)
committerMark Probst <mark.probst@gmail.com>
Mon, 4 Jun 2007 20:49:21 +0000 (20:49 -0000)
* mini.c, driver.c: Changed MonoDomain.jit_code_hash to a
MonoInternalHashTable.

2007-06-04  Mark Probst  <mark.probst@gmail.com>

* domain.c, domain-internals.h (MonoDomain): jit_code_hash is a
MonoInternalHashTable now.

2007-06-04  Mark Probst  <mark.probst@gmail.com>

* interp.c, interp.h (RuntimeMethod): Due to the jit_code_hash
change in MonoDomain this had to be changed slightly, too.

svn path=/trunk/mono/; revision=78594

mono/interpreter/ChangeLog
mono/interpreter/interp.c
mono/interpreter/interp.h
mono/metadata/ChangeLog
mono/metadata/domain-internals.h
mono/metadata/domain.c
mono/mini/ChangeLog
mono/mini/driver.c
mono/mini/mini.c

index 539b54f527c405502fe931435efa1eed9f42c502..fafe2699d6e57e1c5a737d920a8130f648e13a16 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-04  Mark Probst  <mark.probst@gmail.com>
+
+       * interp.c, interp.h (RuntimeMethod): Due to the jit_code_hash
+       change in MonoDomain this had to be changed slightly, too.
+
 2006-05-09  Miguel de Icaza  <miguel@novell.com>
 
        * interp.c (ves_exec_method_with_context): Pass a temporary to the
index 2e7d8da72d77a5d1b6478a43c04ef5a43bf1cb6b..f5560a8594ce7af7f6e4ff9a362136d07aa14d3e 100644 (file)
@@ -263,7 +263,7 @@ mono_interp_get_runtime_method (MonoMethod *method)
        RuntimeMethod *rtm;
 
        EnterCriticalSection (&runtime_method_lookup_section);
-       if ((rtm = g_hash_table_lookup (domain->jit_code_hash, method))) {
+       if ((rtm = mono_internal_hash_table_lookup (&domain->jit_code_hash, method))) {
                LeaveCriticalSection (&runtime_method_lookup_section);
                return rtm;
        }
@@ -273,7 +273,7 @@ mono_interp_get_runtime_method (MonoMethod *method)
        rtm->param_count = mono_method_signature (method)->param_count;
        rtm->hasthis = mono_method_signature (method)->hasthis;
        rtm->valuetype = method->klass->valuetype;
-       g_hash_table_insert (domain->jit_code_hash, method, rtm);
+       mono_internal_hash_table_insert (&domain->jit_code_hash, method, rtm);
        LeaveCriticalSection (&runtime_method_lookup_section);
 
        return rtm;
index 18cc9f245d9447326ab1d1e0b6e70b7223b840c9..0953e5a54cfb93f1448dd9a80a815952469127bb 100644 (file)
@@ -55,8 +55,14 @@ typedef void (*MonoPIFunc) (MonoFunc callme, void *retval, void *obj_this, stack
  * Structure representing a method transformed for the interpreter 
  * This is domain specific
  */
-typedef struct 
+typedef struct _RuntimeMethod
 {
+       /* NOTE: These first two elements (method and
+          next_jit_code_hash) must be in the same order and at the
+          same offset as in MonoJitInfo, because of the jit_code_hash
+          internal hash table in MonoDomain. */
+       MonoMethod *method;
+       struct _RuntimeMethod *next_jit_code_hash;
        guint32 locals_size;
        guint32 args_size;
        guint32 stack_size;
@@ -64,7 +70,6 @@ typedef struct
        guint32 alloca_size;
        unsigned short *code;
        unsigned short *new_body_start; /* after all STINARG instrs */
-       MonoMethod *method;
        MonoPIFunc func;
        int num_clauses;
        MonoExceptionClause *clauses;
index 88230a9d9dc68b0b576506448e8f361789e97f6a..abe70bb357cb468c852ea0420d6f390b7993c8bf 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-04  Mark Probst  <mark.probst@gmail.com>
+
+       * domain.c, domain-internals.h (MonoDomain): jit_code_hash is a
+       MonoInternalHashTable now.
+
 2007-05-31  Zoltan Varga  <vargaz@gmail.com>
 
        * domain-internals.h (MonoDomain): Add two new hash tables to store delegate
index 9554636c4fb225d829f9bda5261b50db352453c3..9243003afeb1375da0fbdfe29ea71f26ef18413a 100644 (file)
@@ -8,6 +8,7 @@
 #include <mono/utils/mono-codeman.h>
 #include <mono/utils/mono-hash.h>
 #include <mono/utils/mono-compiler.h>
+#include <mono/utils/mono-internal-hash.h>
 #include <mono/io-layer/io-layer.h>
 
 extern CRITICAL_SECTION mono_delegate_section;
@@ -47,7 +48,12 @@ typedef struct {
 } MonoJitExceptionInfo;
 
 struct _MonoJitInfo {
+       /* NOTE: These first two elements (method and
+          next_jit_code_hash) must be in the same order and at the
+          same offset as in RuntimeMethod, because of the jit_code_hash
+          internal hash table in MonoDomain. */
        MonoMethod *method;
+       struct _MonoJitInfo *next_jit_code_hash;
        gpointer    code_start;
        guint32     used_regs;
        int         code_size;
@@ -82,6 +88,8 @@ typedef enum {
        MONO_APPDOMAIN_UNLOADED
 } MonoAppDomainState;
 
+typedef struct _MonoJitCodeHash MonoJitCodeHash;
+
 struct _MonoDomain {
        CRITICAL_SECTION    lock;
        MonoMemPool        *mp;
@@ -119,7 +127,7 @@ struct _MonoDomain {
        GHashTable         *class_vtable_hash;
        /* maps remote class key -> MonoRemoteClass */
        GHashTable         *proxy_vtable_hash;
-       GHashTable         *jit_code_hash;
+       MonoInternalHashTable jit_code_hash;
        /* maps MonoMethod -> MonoJitDynamicMethodInfo */
        GHashTable         *dynamic_code_hash;
        MonoJitInfoTable   *jit_info_table;
@@ -184,6 +192,9 @@ mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end) MO
 typedef MonoJitInfo *(*MonoJitInfoFindInAot)         (MonoDomain *domain, MonoImage *image, gpointer addr);
 void          mono_install_jit_info_find_in_aot (MonoJitInfoFindInAot func) MONO_INTERNAL;
 
+void
+mono_jit_code_hash_init (MonoInternalHashTable *jit_code_hash) MONO_INTERNAL;
+
 MonoAppDomain *
 ves_icall_System_AppDomain_getCurDomain            (void) MONO_INTERNAL;
 
index 0a5e3555166a29e2527648b6bac5c45f070fcd0d..dd1e1b99caf9ba9e4448296549503bec14642003 100644 (file)
@@ -339,6 +339,31 @@ mono_jit_info_get_method (MonoJitInfo* ji)
        return ji->method;
 }
 
+static gpointer
+jit_info_key_extract (gpointer value)
+{
+       MonoJitInfo *info = (MonoJitInfo*)value;
+
+       return info->method;
+}
+
+static gpointer*
+jit_info_next_value (gpointer value)
+{
+       MonoJitInfo *info = (MonoJitInfo*)value;
+
+       return (gpointer*)&info->next_jit_code_hash;
+}
+
+void
+mono_jit_code_hash_init (MonoInternalHashTable *jit_code_hash)
+{
+       mono_internal_hash_table_init (jit_code_hash,
+                                      mono_aligned_addr_hash,
+                                      jit_info_key_extract,
+                                      jit_info_next_value);
+}
+
 /**
  * mono_string_equal:
  * @s1: First string to compare
@@ -486,7 +511,7 @@ mono_domain_create (void)
        domain->class_vtable_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
        domain->proxy_vtable_hash = g_hash_table_new ((GHashFunc)mono_ptrarray_hash, (GCompareFunc)mono_ptrarray_equal);
        domain->static_data_array = NULL;
-       domain->jit_code_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
+       mono_jit_code_hash_init (&domain->jit_code_hash);
        domain->ldstr_table = mono_g_hash_table_new ((GHashFunc)mono_string_hash, (GCompareFunc)mono_string_equal);
        domain->jit_info_table = mono_jit_info_table_new ();
        domain->class_init_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
@@ -1109,8 +1134,7 @@ mono_domain_free (MonoDomain *domain, gboolean force)
                mono_gc_free_fixed (domain->static_data_array);
                domain->static_data_array = NULL;
        }
-       g_hash_table_destroy (domain->jit_code_hash);
-       domain->jit_code_hash = 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);
index fa3d2f5fa4b752ad8b7c41420dddf1a026443453..3c75edcbbec21e2048e43a07c46b60ca29ad7358 100644 (file)
@@ -1,3 +1,7 @@
+2007-06-04  Mark Probst  <mark.probst@gmail.com>
+
+       * mini.c, driver.c: Changed MonoDomain.jit_code_hash to a
+       MonoInternalHashTable.
 
 Mon Jun 4 11:29:43 CEST 2007 Paolo Molaro <lupus@ximian.com>
 
index 40907566e080c113dd3ad5f66bf029ebdfba6039..07a7233f7aa21e2043f79891580a74c80dca0c16 100644 (file)
@@ -337,8 +337,8 @@ mini_regression (MonoImage *image, int verbose, int *total_run) {
                /* fixme: ugly hack - delete all previously compiled methods */
                g_hash_table_destroy (mono_domain_get ()->jit_trampoline_hash);
                mono_domain_get ()->jit_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
-               g_hash_table_destroy (mono_domain_get ()->jit_code_hash);
-               mono_domain_get ()->jit_code_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
+               mono_internal_hash_table_destroy (&(mono_domain_get ()->jit_code_hash));
+               mono_jit_code_hash_init (&(mono_domain_get ()->jit_code_hash));
 
                g_timer_start (timer);
                if (mini_stats_fd)
index f6a0e4c67e484fdf80c782ce49f92559e90ec264..8825317742f0c50e0a893434fb6e9cd819959784 100644 (file)
@@ -10718,12 +10718,9 @@ static gpointer
 mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, int opt)
 {
        MonoCompile *cfg;
-       GHashTable *jit_code_hash;
        gpointer code = NULL;
        MonoJitInfo *info;
 
-       jit_code_hash = target_domain->jit_code_hash;
-
        method = mono_get_inflated_method (method);
 
 #ifdef MONO_USE_AOT_COMPILER
@@ -10849,7 +10846,7 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
        /* Check if some other thread already did the job. In this case, we can
        discard the code this thread generated. */
 
-       if ((info = g_hash_table_lookup (target_domain->jit_code_hash, method))) {
+       if ((info = mono_internal_hash_table_lookup (&target_domain->jit_code_hash, method))) {
                /* We can't use a domain specific method in another domain */
                if ((target_domain == mono_domain_get ()) || info->domain_neutral) {
                        code = info->code_start;
@@ -10858,7 +10855,7 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
        }
        
        if (code == NULL) {
-               g_hash_table_insert (jit_code_hash, method, cfg->jit_info);
+               mono_internal_hash_table_insert (&target_domain->jit_code_hash, method, cfg->jit_info);
                code = cfg->native_code;
        }
 
@@ -10917,7 +10914,7 @@ mono_jit_compile_method_with_opt (MonoMethod *method, guint32 opt)
 
        mono_domain_lock (target_domain);
 
-       if ((info = g_hash_table_lookup (target_domain->jit_code_hash, method))) {
+       if ((info = mono_internal_hash_table_lookup (&target_domain->jit_code_hash, method))) {
                /* We can't use a domain specific method in another domain */
                if (! ((domain != target_domain) && !info->domain_neutral)) {
                        mono_domain_unlock (target_domain);
@@ -10978,7 +10975,7 @@ mono_jit_free_method (MonoDomain *domain, MonoMethod *method)
                return;
        mono_domain_lock (domain);
        g_hash_table_remove (domain->dynamic_code_hash, method);
-       g_hash_table_remove (domain->jit_code_hash, method);
+       mono_internal_hash_table_remove (&domain->jit_code_hash, method);
        g_hash_table_remove (domain->jump_trampoline_hash, method);
        mono_domain_unlock (domain);
 
@@ -11023,7 +11020,7 @@ mono_jit_find_compiled_method (MonoDomain *domain, MonoMethod *method)
 
        mono_domain_lock (target_domain);
 
-       if ((info = g_hash_table_lookup (target_domain->jit_code_hash, method))) {
+       if ((info = mono_internal_hash_table_lookup (&target_domain->jit_code_hash, method))) {
                /* We can't use a domain specific method in another domain */
                if (! ((domain != target_domain) && !info->domain_neutral)) {
                        mono_domain_unlock (target_domain);