#include <mono/metadata/marshal.h>
#include <mono/metadata/lock-tracer.h>
#include <mono/metadata/verify-internals.h>
-#include <mono/utils/mono-logger-internal.h>
+#include <mono/utils/mono-logger-internals.h>
#include <mono/utils/mono-dl.h>
#include <mono/utils/mono-membar.h>
#include <mono/utils/mono-counters.h>
* See domain-internals.h for locking policy in combination with the
* domain lock.
*/
-static mono_mutex_t loader_mutex, global_loader_data_mutex;
+static MonoCoopMutex loader_mutex;
+static mono_mutex_t global_loader_data_mutex;
static gboolean loader_lock_inited;
/* Statistics */
static void
global_loader_data_lock (void)
{
- mono_locks_acquire (&global_loader_data_mutex, LoaderGlobalDataLock);
+ mono_locks_os_acquire (&global_loader_data_mutex, LoaderGlobalDataLock);
}
static void
global_loader_data_unlock (void)
{
- mono_locks_release (&global_loader_data_mutex, LoaderGlobalDataLock);
+ mono_locks_os_release (&global_loader_data_mutex, LoaderGlobalDataLock);
}
void
static gboolean inited;
if (!inited) {
- mono_mutex_init_recursive (&loader_mutex);
- mono_mutex_init_recursive (&global_loader_data_mutex);
+ mono_coop_mutex_init_recursive (&loader_mutex);
+ mono_os_mutex_init_recursive (&global_loader_data_mutex);
loader_lock_inited = TRUE;
mono_native_tls_alloc (&loader_error_thread_id, NULL);
mono_native_tls_free (loader_error_thread_id);
mono_native_tls_free (loader_lock_nest_id);
- mono_mutex_destroy (&loader_mutex);
- mono_mutex_destroy (&global_loader_data_mutex);
+ mono_coop_mutex_destroy (&loader_mutex);
+ mono_os_mutex_destroy (&global_loader_data_mutex);
loader_lock_inited = FALSE;
}
ptr++;
param_count = mono_metadata_decode_value (ptr, &ptr);
- inst = mono_metadata_parse_generic_inst (image, NULL, param_count, ptr, &ptr);
- if (!inst) {
- mono_loader_assert_no_error ();
- mono_error_set_bad_image (error, image, "Cannot parse generic instance for methodspec 0x%08x", idx);
+ inst = mono_metadata_parse_generic_inst (image, NULL, param_count, ptr, &ptr, error);
+ if (!inst)
return NULL;
- }
if (context && inst->is_open) {
inst = mono_metadata_inflate_generic_inst (inst, context, error);
if (generic_container) {
result->is_generic = TRUE;
generic_container->owner.method = result;
+ generic_container->is_anonymous = FALSE; // Method is now known, container is no longer anonymous
/*FIXME put this before the image alloc*/
if (!mono_metadata_load_generic_param_constraints_checked (image, token, generic_container, error))
return NULL;
void
mono_loader_lock (void)
{
- MONO_TRY_BLOCKING;
- mono_locks_acquire (&loader_mutex, LoaderLock);
- MONO_FINISH_TRY_BLOCKING;
-
+ mono_locks_coop_acquire (&loader_mutex, LoaderLock);
if (G_UNLIKELY (loader_lock_track_ownership)) {
mono_native_tls_set_value (loader_lock_nest_id, GUINT_TO_POINTER (GPOINTER_TO_UINT (mono_native_tls_get_value (loader_lock_nest_id)) + 1));
}
void
mono_loader_unlock (void)
{
- mono_locks_release (&loader_mutex, LoaderLock);
+ mono_locks_coop_release (&loader_mutex, LoaderLock);
if (G_UNLIKELY (loader_lock_track_ownership)) {
mono_native_tls_set_value (loader_lock_nest_id, GUINT_TO_POINTER (GPOINTER_TO_UINT (mono_native_tls_get_value (loader_lock_nest_id)) - 1));
}