Author: miguel
Date: 2005-05-04 17:47:19 -0400 (Wed, 04 May 2005)
New Revision: 44051

Modified:
   branches/mono-1-1-7/mono/mono/metadata/ChangeLog
   branches/mono-1-1-7/mono/mono/metadata/loader.c
Log:
Apply r44048 and r4405 which fix a multi-app-domain remoting app that might be 
jitting the same method at the same time

Modified: branches/mono-1-1-7/mono/mono/metadata/ChangeLog
===================================================================
--- branches/mono-1-1-7/mono/mono/metadata/ChangeLog    2005-05-04 21:22:31 UTC 
(rev 44050)
+++ branches/mono-1-1-7/mono/mono/metadata/ChangeLog    2005-05-04 21:47:19 UTC 
(rev 44051)
@@ -1,3 +1,7 @@
+2005-05-04  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * loader.c (mono_method_get_signature_full): Add locking here.
+
 2005-05-03  Lluis Sanchez Gual <[EMAIL PROTECTED]>
 
        * appdomain.c: Moved methods for parsing and freeing assembly

Modified: branches/mono-1-1-7/mono/mono/metadata/loader.c
===================================================================
--- branches/mono-1-1-7/mono/mono/metadata/loader.c     2005-05-04 21:22:31 UTC 
(rev 44050)
+++ branches/mono-1-1-7/mono/mono/metadata/loader.c     2005-05-04 21:47:19 UTC 
(rev 44051)
@@ -247,7 +247,7 @@
        int table = mono_metadata_token_table (token);
        int idx = mono_metadata_token_index (token);
        guint32 cols [MONO_MEMBERREF_SIZE];
-       MonoMethodSignature *sig;
+       MonoMethodSignature *sig, *prev_sig;
        const char *ptr;
 
        /* !table is for wrappers: we should really assign their own token to 
them */
@@ -270,13 +270,26 @@
                /* FIXME: This might be incorrect for vararg methods */
                return mono_method_signature (method);
 
-       if (!(sig = g_hash_table_lookup (image->memberref_signatures, 
GUINT_TO_POINTER (token)))) {
+       mono_loader_lock ();
+       sig = g_hash_table_lookup (image->memberref_signatures, 
GUINT_TO_POINTER (token));
+       mono_loader_unlock ();
+       if (!sig) {
                mono_metadata_decode_row (&image->tables 
[MONO_TABLE_MEMBERREF], idx-1, cols, MONO_MEMBERREF_SIZE);
        
                ptr = mono_metadata_blob_heap (image, cols 
[MONO_MEMBERREF_SIGNATURE]);
                mono_metadata_decode_blob_size (ptr, &ptr);
                sig = mono_metadata_parse_method_signature_full (image, 
context, 0, ptr, NULL);
-               g_hash_table_insert (image->memberref_signatures, 
GUINT_TO_POINTER (token), sig);
+
+               mono_loader_lock ();
+               prev_sig = g_hash_table_lookup (image->memberref_signatures, 
GUINT_TO_POINTER (token));
+               if (prev_sig) {
+                       /* Somebody got in before us */
+                       /* FIXME: Free sig */
+                       sig = prev_sig;
+               }
+               else
+                       g_hash_table_insert (image->memberref_signatures, 
GUINT_TO_POINTER (token), sig);
+               mono_loader_unlock ();
        }
 
        sig = mono_class_inflate_generic_signature (image, sig, context);

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

Reply via email to