2008-07-02 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Wed, 2 Jul 2008 17:03:44 +0000 (17:03 -0000)
committerZoltan Varga <vargaz@gmail.com>
Wed, 2 Jul 2008 17:03:44 +0000 (17:03 -0000)
* mini-x86.c (mono_arch_get_delegate_invoke_impl): Remove locking, speed up the
fast path a bit.

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

mono/mini/ChangeLog
mono/mini/mini-x86.c

index e87ae569dc55179da8d6ed315fe781b125f1805a..7e34d79573e3069cbc85fd9d0bdcf3205fb3474d 100644 (file)
@@ -1,5 +1,8 @@
 2008-07-02  Zoltan Varga  <vargaz@gmail.com>
 
+       * mini-x86.c (mono_arch_get_delegate_invoke_impl): Remove locking, speed up the
+       fast path a bit.
+       
        * mini-trampolines.c (mono_delegate_trampoline): Add a comment.
 
        * mini-amd64.c (mono_arch_get_delegate_invoke_impl): Remove locking, speed up the
index 73d056080c6a890716b17b0e6762788b2e197a7d..fac96ce235f2221e0db37e943ff7dcec6a75fb4a 100644 (file)
@@ -4492,13 +4492,6 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe
 {
        guint8 *code, *start;
 
-       if (sig->param_count > MAX_ARCH_DELEGATE_PARAMS)
-               return NULL;
-
-       /* FIXME: Support more cases */
-       if (MONO_TYPE_ISSTRUCT (sig->ret))
-               return NULL;
-
        /*
         * The stack contains:
         * <delegate>
@@ -4507,12 +4500,17 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe
 
        if (has_target) {
                static guint8* cached = NULL;
-               mono_mini_arch_lock ();
-               if (cached) {
-                       mono_mini_arch_unlock ();
+
+               if (cached)
                        return cached;
-               }
-               
+
+               if (sig->param_count > MAX_ARCH_DELEGATE_PARAMS)
+                       return NULL;
+
+               /* FIXME: Support more cases */
+               if (MONO_TYPE_ISSTRUCT (sig->ret))
+                       return NULL;
+
                start = code = mono_global_codeman_reserve (64);
 
                /* Replace the this argument with the target */
@@ -4523,25 +4521,31 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe
 
                g_assert ((code - start) < 64);
 
-               cached = start;
                mono_debug_add_delegate_trampoline (start, code - start);
-               mono_mini_arch_unlock ();
+
+               mono_memory_barrier ();
+
+               cached = start;
        } else {
                static guint8* cache [MAX_ARCH_DELEGATE_PARAMS + 1] = {NULL};
                int i = 0;
                /* 8 for mov_reg and jump, plus 8 for each parameter */
                int code_reserve = 8 + (sig->param_count * 8);
 
+               code = cache [sig->param_count];
+               if (code)
+                       return code;
+
                for (i = 0; i < sig->param_count; ++i)
                        if (!mono_is_regsize_var (sig->params [i]))
                                return NULL;
 
-               mono_mini_arch_lock ();
-               code = cache [sig->param_count];
-               if (code) {
-                       mono_mini_arch_unlock ();
-                       return code;
-               }
+               if (sig->param_count > MAX_ARCH_DELEGATE_PARAMS)
+                       return NULL;
+
+               /* FIXME: Support more cases */
+               if (MONO_TYPE_ISSTRUCT (sig->ret))
+                       return NULL;
 
                /*
                 * The stack contains:
@@ -4574,10 +4578,11 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe
 
                g_assert ((code - start) < code_reserve);
 
-               cache [sig->param_count] = start;
-
                mono_debug_add_delegate_trampoline (start, code - start);
-               mono_mini_arch_unlock ();
+
+               mono_memory_barrier ();
+
+               cache [sig->param_count] = start;
        }
 
        return start;