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