Author: zoltan
Date: 2005-05-04 16:59:45 -0400 (Wed, 04 May 2005)
New Revision: 44048

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/loader.c
Log:
2005-05-04  Zoltan Varga  <[EMAIL PROTECTED]>

        * loader.c (mono_method_get_signature_full): Add locking here.


Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2005-05-04 20:53:02 UTC (rev 44047)
+++ trunk/mono/mono/metadata/ChangeLog  2005-05-04 20:59:45 UTC (rev 44048)
@@ -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: trunk/mono/mono/metadata/loader.c
===================================================================
--- trunk/mono/mono/metadata/loader.c   2005-05-04 20:53:02 UTC (rev 44047)
+++ trunk/mono/mono/metadata/loader.c   2005-05-04 20:59:45 UTC (rev 44048)
@@ -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,14 +270,28 @@
                /* 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 ();
        }
+       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