diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c index 69d455956b87..2760e61250fa 100644 --- a/mono/metadata/domain.c +++ b/mono/metadata/domain.c @@ -1052,8 +1052,16 @@ mono_domain_foreach (MonoDomainFunc func, gpointer user_data) void mono_unity_domain_foreach_locked(MonoDomainFunc func, gpointer user_data) { + int i; mono_coop_mutex_lock(&mono_domain_unload_mutex); - mono_domain_foreach(func, user_data); + + mono_appdomains_lock(); + for (i = 0; i < appdomain_list_size; ++i) { + if (appdomains_list[i]) + func(appdomains_list[i], user_data); + } + mono_appdomains_unlock(); + mono_coop_mutex_unlock(&mono_domain_unload_mutex); } diff --git a/mono/metadata/etw-profiler.c b/mono/metadata/etw-profiler.c index 80d969bac15b..83a8666d132d 100644 --- a/mono/metadata/etw-profiler.c +++ b/mono/metadata/etw-profiler.c @@ -274,11 +274,18 @@ on_enumerate_domain (MonoDomain *domain, void *user_data) struct JITEnumerationData *enumerationData = (struct JITEnumerationData *)user_data; enumerationData->mNumDomains++; + mono_loader_lock(); + + mono_domain_lock(domain); // Iterate through each assembly mono_domain_assembly_foreach (domain, on_enumerate_assembly, enumerationData); // Iterate through each JIT'ed method mono_domain_jit_foreach (domain, on_enumerate_jit_method, enumerationData); + + mono_domain_unlock(domain); + + mono_loader_unlock(); } static void