Author: lupus
Date: 2007-10-12 11:34:45 -0400 (Fri, 12 Oct 2007)
New Revision: 87398

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/marshal.c
Log:


Fri Oct 12 17:50:11 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>

        * marshal.c: deal with a possible race condition during multicast
        delegate invocation.



Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-10-12 15:22:12 UTC (rev 87397)
+++ trunk/mono/mono/metadata/ChangeLog  2007-10-12 15:34:45 UTC (rev 87398)
@@ -1,4 +1,9 @@
 
+Fri Oct 12 17:50:11 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>
+
+       * marshal.c: deal with a possible race condition during multicast
+       delegate invocation.
+
 Fri Oct 12 13:31:11 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>
 
        * class.c: ensure value type methods don't have the synchronized

Modified: trunk/mono/mono/metadata/marshal.c
===================================================================
--- trunk/mono/mono/metadata/marshal.c  2007-10-12 15:22:12 UTC (rev 87397)
+++ trunk/mono/mono/metadata/marshal.c  2007-10-12 15:34:45 UTC (rev 87398)
@@ -4680,6 +4680,7 @@
        MonoMethodBuilder *mb;
        MonoMethod *res;
        GHashTable *cache;
+       int local_prev, local_target;
        int pos0;
        char *name;
 
@@ -4700,7 +4701,8 @@
        g_free (name);
 
        /* allocate local 0 (object) */
-       mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg);
+       local_target = mono_mb_add_local (mb, 
&mono_defaults.object_class->byval_arg);
+       local_prev = mono_mb_add_local (mb, 
&mono_defaults.object_class->byval_arg);
 
        g_assert (sig->hasthis);
        
@@ -4717,6 +4719,8 @@
        mono_mb_emit_ldarg (mb, 0);
        mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoMulticastDelegate, prev));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
+       mono_mb_emit_stloc (mb, local_prev);
+       mono_mb_emit_ldloc (mb, local_prev);
 
        /* if prev != null */
        pos0 = mono_mb_emit_branch (mb, CEE_BRFALSE);
@@ -4726,9 +4730,7 @@
        mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
        mono_mb_emit_byte (mb, CEE_MONO_NOT_TAKEN);
 
-       mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoMulticastDelegate, prev));
-       mono_mb_emit_byte (mb, CEE_LDIND_REF);
+       mono_mb_emit_ldloc (mb, local_prev);
        for (i = 0; i < sig->param_count; i++)
                mono_mb_emit_ldarg (mb, i + 1);
        mono_mb_emit_managed_call (mb, method, mono_method_signature (method));
@@ -4742,14 +4744,14 @@
        mono_mb_emit_ldarg (mb, 0);
        mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoDelegate, target));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
-       mono_mb_emit_stloc (mb, 0);
+       mono_mb_emit_stloc (mb, local_target);
 
        /* if target != null */
-       mono_mb_emit_ldloc (mb, 0);
+       mono_mb_emit_ldloc (mb, local_target);
        pos0 = mono_mb_emit_branch (mb, CEE_BRFALSE);
        
        /* then call this->method_ptr nonstatic */
-       mono_mb_emit_ldloc (mb, 0); 
+       mono_mb_emit_ldloc (mb, local_target); 
        for (i = 0; i < sig->param_count; ++i)
                mono_mb_emit_ldarg (mb, i + 1);
        mono_mb_emit_ldarg (mb, 0);
@@ -4771,8 +4773,7 @@
 
        mono_mb_emit_byte (mb, CEE_RET);
 
-       res = mono_mb_create_and_cache (cache, sig,
-                                                                               
 mb, sig, sig->param_count + 16);
+       res = mono_mb_create_and_cache (cache, sig, mb, sig, sig->param_count + 
16);
        mono_mb_free (mb);
 
        return res;     

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to