Mercurial > hg > graal-compiler
changeset 8848:d886ac1dfd36
8010723: fatal error: acquiring lock Metaspace allocation lock/5 out of order
Summary: Avoid holding SystemDictionary_lock while calling Klass::remove_unshareable_info
Reviewed-by: coleenp, acorn
Contributed-by: ioi.lam@oracle.com
author | coleenp |
---|---|
date | Sun, 31 Mar 2013 21:43:10 -0400 |
parents | c0f9217203b2 |
children | e458120c6e1a |
files | src/share/vm/classfile/systemDictionary.cpp |
diffstat | 1 files changed, 17 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/classfile/systemDictionary.cpp Fri Mar 29 08:38:00 2013 -0700 +++ b/src/share/vm/classfile/systemDictionary.cpp Sun Mar 31 21:43:10 2013 -0400 @@ -816,13 +816,28 @@ // We didn't go as far as Klass::restore_unshareable_info(), // so nothing to clean up. } else { - MutexLocker mu(SystemDictionary_lock, THREAD); - Klass* kk = find_class(name, ik->class_loader_data()); + Klass *kk; + { + MutexLocker mu(SystemDictionary_lock, THREAD); + kk = find_class(name, ik->class_loader_data()); + } if (kk != NULL) { // No clean up is needed if the shared class has been entered // into system dictionary, as load_shared_class() won't be called // again. } else { + // This must be done outside of the SystemDictionary_lock to + // avoid deadlock. + // + // Note that Klass::restore_unshareable_info (called via + // load_instance_class above) is also called outside + // of SystemDictionary_lock. Other threads are blocked from + // loading this class because they are waiting on the + // SystemDictionary_lock until this thread removes + // the placeholder below. + // + // This need to be re-thought when parallel-capable non-boot + // classloaders are supported by CDS (today they're not). clean_up_shared_class(ik, class_loader, THREAD); } }