Skip to content

Commit 3ff9b2e

Browse files
backport fixes from pr #2178
* add in locked version of mono_domain_foreach * add in unity prefix to new mutex and commented intended use case * name update
1 parent 063ba6e commit 3ff9b2e

File tree

4 files changed

+25
-1
lines changed

4 files changed

+25
-1
lines changed

mono/metadata/appdomain.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3312,9 +3312,13 @@ deregister_reflection_info_roots (MonoDomain *domain)
33123312
mono_domain_assemblies_unlock (domain);
33133313
}
33143314

3315+
extern MonoCoopMutex mono_domain_unload_mutex;
3316+
33153317
static gsize WINAPI
33163318
unload_thread_main (void *arg)
33173319
{
3320+
mono_coop_mutex_lock(&mono_domain_unload_mutex);
3321+
33183322
unload_data *data = (unload_data*)arg;
33193323
MonoDomain *domain = data->domain;
33203324
MonoMemoryManager *memory_manager = mono_domain_memory_manager (domain);
@@ -3386,6 +3390,7 @@ unload_thread_main (void *arg)
33863390

33873391
result = 0; // success
33883392
exit:
3393+
mono_coop_mutex_unlock(&mono_domain_unload_mutex);
33893394
mono_atomic_store_release (&data->done, TRUE);
33903395
unload_data_unref (data);
33913396
return result;

mono/metadata/appdomain.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ mono_domain_jit_foreach (MonoDomain *domain, MonoJitInfoFunc func, void *user_da
109109
MONO_API void
110110
mono_domain_foreach (MonoDomainFunc func, void* user_data);
111111

112+
MONO_API void
113+
mono_unity_domain_foreach_locked (MonoDomainFunc func, void* user_data);
114+
112115
MONO_API void
113116
mono_domain_assembly_foreach (MonoDomain* domain, MonoDomainAssemblyFunc func, void* user_data);
114117

mono/metadata/domain.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ gboolean mono_dont_free_domains;
8686
#define mono_appdomains_unlock() mono_coop_mutex_unlock (&appdomains_mutex)
8787
static MonoCoopMutex appdomains_mutex;
8888

89+
/* Lock used to prevent domain enumeration while domains may be unloading.
90+
* This lock must be taken before any other domain-related locks to prevent deadlock.
91+
* See https://github.com/Unity-Technologies/mono/pull/2173
92+
*/
93+
MonoCoopMutex mono_domain_unload_mutex;
94+
8995
static MonoDomain *mono_root_domain = NULL;
9096

9197
/* some statistics */
@@ -559,6 +565,7 @@ mono_init_internal (const char *filename, const char *exe_filename, const char *
559565
mono_thread_info_attach ();
560566

561567
mono_coop_mutex_init_recursive (&appdomains_mutex);
568+
mono_coop_mutex_init_recursive(&mono_domain_unload_mutex);
562569

563570
mono_metadata_init ();
564571
mono_images_init ();
@@ -925,6 +932,7 @@ mono_cleanup (void)
925932
mono_metadata_cleanup ();
926933

927934
mono_coop_mutex_destroy (&appdomains_mutex);
935+
mono_coop_mutex_destroy (&mono_domain_unload_mutex);
928936

929937
mono_w32process_cleanup ();
930938
mono_w32file_cleanup ();
@@ -1041,6 +1049,14 @@ mono_domain_foreach (MonoDomainFunc func, gpointer user_data)
10411049
MONO_EXIT_GC_UNSAFE;
10421050
}
10431051

1052+
void
1053+
mono_unity_domain_foreach_locked(MonoDomainFunc func, gpointer user_data)
1054+
{
1055+
mono_coop_mutex_lock(&mono_domain_unload_mutex);
1056+
mono_domain_foreach(func, user_data);
1057+
mono_coop_mutex_unlock(&mono_domain_unload_mutex);
1058+
}
1059+
10441060
void
10451061
mono_domain_ensure_entry_assembly (MonoDomain *domain, MonoAssembly *assembly)
10461062
{

mono/metadata/etw-profiler.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ on_attach ()
290290
memset (&enumerationData, 0, sizeof (enumerationData));
291291

292292
// Iterate through each domain
293-
mono_domain_foreach (on_enumerate_domain, &enumerationData);
293+
mono_unity_domain_foreach_locked (on_enumerate_domain, &enumerationData);
294294

295295
ETW_PROFILER_LOG_ARGS ("Finished enumerating JIT data. Found %d domains, %d assemblies, %d methods", enumerationData.mNumDomains, enumerationData.mNumAssemblies, enumerationData.mNumMethods);
296296
}

0 commit comments

Comments
 (0)