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