Skip to content

Commit 40d2134

Browse files
[release/8.0] [mono][metadata] Replace use of mem manager lock with loader lock (#91327)
* [mono][metadata] Replace use of mem manager lock with loader lock Hash table operations under the mem manager lock could end up taking the loader lock when performing type comparison, in the case where custom modifiers needed to be loaded. Use the loader lock instead to prevent deadlocks. * [mono][metadata] Use loader lock during generic class hash table lookup --------- Co-authored-by: Vlad Brezae <[email protected]>
1 parent 36b3790 commit 40d2134

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/mono/mono/metadata/metadata.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3434,7 +3434,8 @@ mono_metadata_get_canonical_generic_inst (MonoGenericInst *candidate)
34343434
MonoMemoryManager *mm = mono_mem_manager_get_generic (data.images, data.nimages);
34353435
collect_data_free (&data);
34363436

3437-
mono_mem_manager_lock (mm);
3437+
// Hashtable key equal func can take loader lock
3438+
mono_loader_lock ();
34383439

34393440
if (!mm->ginst_cache)
34403441
mm->ginst_cache = g_hash_table_new_full (mono_metadata_generic_inst_hash, mono_metadata_generic_inst_equal, NULL, (GDestroyNotify)free_generic_inst);
@@ -3456,7 +3457,7 @@ mono_metadata_get_canonical_generic_inst (MonoGenericInst *candidate)
34563457
g_hash_table_insert (mm->ginst_cache, ginst, ginst);
34573458
}
34583459

3459-
mono_mem_manager_unlock (mm);
3460+
mono_loader_unlock ();
34603461

34613462
return ginst;
34623463
}
@@ -3467,7 +3468,8 @@ mono_metadata_get_canonical_aggregate_modifiers (MonoAggregateModContainer *cand
34673468
g_assert (candidate->count > 0);
34683469
MonoMemoryManager *mm = mono_metadata_get_mem_manager_for_aggregate_modifiers (candidate);
34693470

3470-
mono_mem_manager_lock (mm);
3471+
// Hashtable key equal func can take loader lock
3472+
mono_loader_lock ();
34713473

34723474
if (!mm->aggregate_modifiers_cache)
34733475
mm->aggregate_modifiers_cache = g_hash_table_new_full (aggregate_modifiers_hash, aggregate_modifiers_equal, NULL, (GDestroyNotify)free_aggregate_modifiers);
@@ -3484,7 +3486,7 @@ mono_metadata_get_canonical_aggregate_modifiers (MonoAggregateModContainer *cand
34843486

34853487
g_hash_table_insert (mm->aggregate_modifiers_cache, amods, amods);
34863488
}
3487-
mono_mem_manager_unlock (mm);
3489+
mono_loader_unlock ();
34883490
return amods;
34893491
}
34903492

@@ -3543,7 +3545,8 @@ mono_metadata_lookup_generic_class (MonoClass *container_class, MonoGenericInst
35433545
if (gclass)
35443546
return gclass;
35453547

3546-
mono_mem_manager_lock (mm);
3548+
// Hashtable key equal func can take loader lock
3549+
mono_loader_lock ();
35473550

35483551
gclass = mono_mem_manager_alloc0 (mm, sizeof (MonoGenericClass));
35493552
if (is_dynamic)
@@ -3563,7 +3566,7 @@ mono_metadata_lookup_generic_class (MonoClass *container_class, MonoGenericInst
35633566

35643567
// g_hash_table_insert (set->gclass_cache, gclass, gclass);
35653568

3566-
mono_mem_manager_unlock (mm);
3569+
mono_loader_unlock ();
35673570

35683571
return gclass2;
35693572
}

0 commit comments

Comments
 (0)