Simple locks:
Can be acquired at any point regardless of which locks are taken or not.
No other locks can be acquired or released while holding a simple lock.
- Reentrancy is not recomended. (warning)
+ Reentrancy is not recommended. (warning)
Simple locks are leaf locks on the lock lattice.
Complex locks:
WARNING: tried to acquire lock ImageDataLock at mono_image_init_name_cache while holding ImageDataLock at mono_class_from_name
WARNING: tried to acquire lock ImageDataLock at mono_image_init_name_cache while holding ImageDataLock at mono_image_add_to_name_cache
Both of those happen when filling up the name_cache, as it needs to alloc image memory.
- This one is fixable by spliting mono_image_init_name_cache into a locked and an unlocked variants and calling them appropriatedly.
+ This one is fixable by splitting mono_image_init_name_cache into a locked and an unlocked variants and calling them appropriately.
*/
AssemblyBindingLock,
MarshalLock,
ClassesLock,
- LoaderGlobalDataLock
+ LoaderGlobalDataLock,
+ ThreadsLock,
}
public class SimLock
}
public override string ToString () {
- return String.Format ("{0}", kind);
+ switch (kind) {
+ case Lock.LoaderLock:
+ case Lock.IcallLock:
+ case Lock.AssemblyBindingLock:
+ case Lock.MarshalLock:
+ case Lock.ClassesLock:
+ case Lock.LoaderGlobalDataLock:
+ case Lock.ThreadsLock:
+ return String.Format ("{0}", kind);
+
+ case Lock.ImageDataLock:
+ case Lock.DomainLock:
+ case Lock.DomainAssembliesLock:
+ case Lock.DomainJitCodeHashLock:
+ return String.Format ("{0}[{1}]", kind, id);
+ default:
+ return String.Format ("Unknown({0})[{1}]", kind, id);
+ }
}
}
"add_record",
"mono_locks_lock_acquired",
"mono_locks_lock_released",
+ "mono_threads_lock",
+ "mono_threads_unlock",
+ "mono_domain_lock",
+ "mono_domain_unlock",
};
public Trace (string[] fields) {