diff --git a/src/mono/mono/metadata/loader.c b/src/mono/mono/metadata/loader.c index fc64623fad6525..55b7c10a08d4d4 100644 --- a/src/mono/mono/metadata/loader.c +++ b/src/mono/mono/metadata/loader.c @@ -81,30 +81,31 @@ static gint32 signatures_size; void mono_loader_init () { - static gboolean inited; + static volatile gboolean inited = FALSE; // volatile to avoid race conditions - // FIXME: potential race - if (!inited) { - mono_coop_mutex_init_recursive (&loader_mutex); - mono_os_mutex_init_recursive (&global_loader_data_mutex); - loader_lock_inited = TRUE; + if (inited) { + return; + } + + inited = TRUE; - mono_global_loader_cache_init (); + 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_lock_nest_id, NULL); + mono_global_loader_cache_init (); - mono_counters_init (); - mono_counters_register ("Inflated signatures size", + mono_native_tls_alloc (&loader_lock_nest_id, NULL); + + mono_counters_init (); + mono_counters_register ("Inflated signatures size", MONO_COUNTER_GENERICS | MONO_COUNTER_INT, &inflated_signatures_size); - mono_counters_register ("Memberref signature cache size", + mono_counters_register ("Memberref signature cache size", MONO_COUNTER_METADATA | MONO_COUNTER_INT, &memberref_sig_cache_size); - mono_counters_register ("MonoMethod size", + mono_counters_register ("MonoMethod size", MONO_COUNTER_METADATA | MONO_COUNTER_INT, &methods_size); - mono_counters_register ("MonoMethodSignature size", + mono_counters_register ("MonoMethodSignature size", MONO_COUNTER_METADATA | MONO_COUNTER_INT, &signatures_size); - - inited = TRUE; - } } void