int count = 0;
gboolean found;
+ mono_loader_lock ();
/*
* According to the spec, custom modifiers should come before the byref
* flag, but the IL produced by ilasm from the following signature:
if (!do_mono_metadata_parse_type (type, m, container, ptr, &ptr)) {
if (type != &stype)
g_free (type);
+ mono_loader_unlock ();
return NULL;
}
LOCKING: even though we don't explicitly hold a lock, in the problematic case 'ret' is a field
of a MonoClass which currently holds the loader lock. 'type' is local.
*/
- if (ret->data.klass == type->data.klass)
+ if (ret->data.klass == type->data.klass) {
+ mono_loader_unlock ();
return ret;
+ }
}
/* No need to use locking since nobody is modifying the hash table */
- if ((cached = g_hash_table_lookup (type_cache, type)))
+ if ((cached = g_hash_table_lookup (type_cache, type))) {
+ mono_loader_unlock ();
return cached;
+ }
}
/* printf ("%x %x %c %s\n", type->attrs, type->num_mods, type->pinned ? 'p' : ' ', mono_type_full_name (type)); */
type = mono_mempool_alloc (m->mempool, sizeof (MonoType));
memcpy (type, &stype, sizeof (MonoType));
}
+ mono_loader_unlock ();
return type;
}
{
MonoMethodSignature *sig;
+ mono_loader_lock ();
sig = mono_mempool_alloc0 (m->mempool, sizeof (MonoMethodSignature) + ((gint32)nparams - MONO_ZERO_LEN_ARRAY) * sizeof (MonoType*));
sig->param_count = nparams;
sig->sentinelpos = -1;
+ mono_loader_unlock ();
return sig;
}
g_return_val_if_fail (ptr != NULL, NULL);
+ mono_loader_lock ();
switch (format) {
case METHOD_HEADER_TINY_FORMAT:
mh = mono_mempool_alloc0 (m->mempool, sizeof (MonoMethodHeader));
local_var_sig_tok = 0;
mh->code_size = flags >> 2;
mh->code = ptr;
+ mono_loader_unlock ();
return mh;
case METHOD_HEADER_TINY_FORMAT1:
mh = mono_mempool_alloc0 (m->mempool, sizeof (MonoMethodHeader));
*/
mh->code_size = flags >> 2;
mh->code = ptr;
+ mono_loader_unlock ();
return mh;
case METHOD_HEADER_FAT_FORMAT:
fat_flags = read16 (ptr);
ptr = code + code_size;
break;
default:
+ mono_loader_unlock ();
return NULL;
}
mh->locals [i] = mono_metadata_parse_type_full (
m, container, MONO_PARSE_LOCAL, 0, locals_ptr, &locals_ptr);
if (!mh->locals [i]) {
+ mono_loader_unlock ();
return NULL;
}
}
mh->init_locals = init_locals;
if (fat_flags & METHOD_HEADER_MORE_SECTS)
parse_section_data (m, mh, (const unsigned char*)ptr);
+ mono_loader_unlock ();
return mh;
}
++pos;
}
+ mono_loader_lock ();
result = mono_mempool_alloc0 (meta->mempool, sizeof (MonoClass*) * (pos - start));
+ mono_loader_unlock ();
pos = start;
while (pos < tdef->rows) {