Mercurial > hg > truffle
diff src/share/vm/classfile/javaClasses.cpp @ 514:c81d2ef51ca3
4670071: loadClassInternal is too restrictive.
Summary: VM support for deadlock fix. Library fix in 4735126. See API proposal.
Reviewed-by: dholmes, blacklion
author | acorn |
---|---|
date | Mon, 05 Jan 2009 13:44:03 -0500 |
parents | 2328d1d3f8cf |
children | 0fbdb4381b99 |
line wrap: on
line diff
--- a/src/share/vm/classfile/javaClasses.cpp Wed Dec 24 19:13:53 2008 -0800 +++ b/src/share/vm/classfile/javaClasses.cpp Mon Jan 05 13:44:03 2009 -0500 @@ -441,6 +441,7 @@ bool java_lang_Class::offsets_computed = false; int java_lang_Class::classRedefinedCount_offset = -1; +int java_lang_Class::parallelCapable_offset = -1; void java_lang_Class::compute_offsets() { assert(!offsets_computed, "offsets should be initialized only once"); @@ -451,6 +452,23 @@ // so don't go fatal. compute_optional_offset(classRedefinedCount_offset, k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature()); + + // The field indicating parallelCapable (parallelLockMap) is only present starting in 7, + klassOop k1 = SystemDictionary::classloader_klass(); + compute_optional_offset(parallelCapable_offset, + k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature()); +} + +// For class loader classes, parallelCapable defined +// based on non-null field +// Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it +bool java_lang_Class::parallelCapable(oop class_loader) { + if (!JDK_Version::is_gte_jdk17x_version() + || parallelCapable_offset == -1) { + // Default for backward compatibility is false + return false; + } + return (class_loader->obj_field(parallelCapable_offset) != NULL); } int java_lang_Class::classRedefinedCount(oop the_class_mirror) {