Skip to content

Commit 83adaf5

Browse files
author
Doug Simon
committed
8313421: [JVMCI] avoid locking class loader in CompilerToVM.lookupType
Reviewed-by: never, thartmann
1 parent 35b60f9 commit 83adaf5

File tree

8 files changed

+74
-52
lines changed

8 files changed

+74
-52
lines changed

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ C2V_VMENTRY_0(jboolean, shouldInlineMethod,(JNIEnv* env, jobject, ARGUMENT_PAIR(
576576
return CompilerOracle::should_inline(method) || method->force_inline();
577577
C2V_END
578578

579-
C2V_VMENTRY_NULL(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, ARGUMENT_PAIR(accessing_klass), jboolean resolve))
579+
C2V_VMENTRY_NULL(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, ARGUMENT_PAIR(accessing_klass), jint accessing_klass_loader, jboolean resolve))
580580
JVMCIObject name = JVMCIENV->wrap(jname);
581581
const char* str = JVMCIENV->as_utf8_string(name);
582582
TempNewSymbol class_name = SymbolTable::new_symbol(str);
@@ -593,15 +593,20 @@ C2V_VMENTRY_NULL(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, ARGU
593593
class_loader = Handle(THREAD, accessing_klass->class_loader());
594594
protection_domain = Handle(THREAD, accessing_klass->protection_domain());
595595
} else {
596-
// Use the System class loader
597-
class_loader = Handle(THREAD, SystemDictionary::java_system_loader());
596+
switch (accessing_klass_loader) {
597+
case 0: break; // class_loader is already null, the boot loader
598+
case 1: class_loader = Handle(THREAD, SystemDictionary::java_platform_loader()); break;
599+
case 2: class_loader = Handle(THREAD, SystemDictionary::java_system_loader()); break;
600+
default:
601+
JVMCI_THROW_MSG_0(InternalError, err_msg("Illegal class loader value: %d", accessing_klass_loader));
602+
}
598603
JVMCIENV->runtime()->initialize(JVMCI_CHECK_NULL);
599604
}
600605

601606
if (resolve) {
602607
resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_NULL);
603608
if (resolved_klass == nullptr) {
604-
JVMCI_THROW_MSG_NULL(ClassNotFoundException, str);
609+
JVMCI_THROW_MSG_NULL(NoClassDefFoundError, str);
605610
}
606611
} else {
607612
if (Signature::has_envelope(class_name)) {
@@ -3108,7 +3113,7 @@ JNINativeMethod CompilerToVM::methods[] = {
31083113
{CC "isCompilable", CC "(" HS_METHOD2 ")Z", FN_PTR(isCompilable)},
31093114
{CC "hasNeverInlineDirective", CC "(" HS_METHOD2 ")Z", FN_PTR(hasNeverInlineDirective)},
31103115
{CC "shouldInlineMethod", CC "(" HS_METHOD2 ")Z", FN_PTR(shouldInlineMethod)},
3111-
{CC "lookupType", CC "(" STRING HS_KLASS2 "Z)" HS_RESOLVED_TYPE, FN_PTR(lookupType)},
3116+
{CC "lookupType", CC "(" STRING HS_KLASS2 "IZ)" HS_RESOLVED_TYPE, FN_PTR(lookupType)},
31123117
{CC "lookupJClass", CC "(J)" HS_RESOLVED_TYPE, FN_PTR(lookupJClass)},
31133118
{CC "getArrayType", CC "(C" HS_KLASS2 ")" HS_KLASS, FN_PTR(getArrayType)},
31143119
{CC "lookupClass", CC "(" CLASS ")" HS_RESOLVED_TYPE, FN_PTR(lookupClass)},

src/hotspot/share/jvmci/jvmciEnv.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ DO_THROW(InvalidInstalledCodeException)
864864
DO_THROW(UnsatisfiedLinkError)
865865
DO_THROW(UnsupportedOperationException)
866866
DO_THROW(OutOfMemoryError)
867-
DO_THROW(ClassNotFoundException)
867+
DO_THROW(NoClassDefFoundError)
868868

869869
#undef DO_THROW
870870

src/hotspot/share/jvmci/jvmciEnv.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ class JVMCIEnv : public ResourceObj {
358358
DO_THROW(UnsatisfiedLinkError)
359359
DO_THROW(UnsupportedOperationException)
360360
DO_THROW(OutOfMemoryError)
361-
DO_THROW(ClassNotFoundException)
361+
DO_THROW(NoClassDefFoundError)
362362

363363
#undef DO_THROW
364364

src/hotspot/share/jvmci/jvmciJavaClasses.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,11 +243,11 @@
243243
start_class(InternalError, java_lang_InternalError) \
244244
jvmci_constructor(InternalError, "(Ljava/lang/String;)V") \
245245
end_class \
246-
start_class(OutOfMemoryError, java_lang_OutOfMemoryError) \
247-
jvmci_constructor(OutOfMemoryError, "(Ljava/lang/String;)V") \
246+
start_class(OutOfMemoryError, java_lang_OutOfMemoryError) \
247+
jvmci_constructor(OutOfMemoryError, "(Ljava/lang/String;)V") \
248248
end_class \
249-
start_class(ClassNotFoundException, java_lang_ClassNotFoundException) \
250-
jvmci_constructor(ClassNotFoundException, "(Ljava/lang/String;)V") \
249+
start_class(NoClassDefFoundError, java_lang_NoClassDefFoundError) \
250+
jvmci_constructor(NoClassDefFoundError, "(Ljava/lang/String;)V") \
251251
end_class \
252252
start_class(InvalidInstalledCodeException, jdk_vm_ci_code_InvalidInstalledCodeException) \
253253
jvmci_constructor(InvalidInstalledCodeException, "(Ljava/lang/String;)V") \

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/CompilerToVM.java

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -240,20 +240,52 @@ boolean methodIsIgnoredBySecurityStackWalk(HotSpotResolvedJavaMethodImpl method)
240240
* Converts a name to a type.
241241
*
242242
* @param name a well formed Java type in {@linkplain JavaType#getName() internal} format
243-
* @param accessingClass the context of resolution. A value of {@code null} implies that the
244-
* class should be resolved with the {@linkplain ClassLoader#getSystemClassLoader()
245-
* system class loader}.
243+
* @param accessingClass the class loader of this class is used for resolution. Must not be null.
246244
* @param resolve force resolution to a {@link ResolvedJavaType}. If true, this method will
247245
* either return a {@link ResolvedJavaType} or throw an exception
248246
* @return the type for {@code name} or 0 if resolution failed and {@code resolve == false}
249-
* @throws ClassNotFoundException if {@code resolve == true} and the resolution failed
247+
* @throws NoClassDefFoundError if {@code resolve == true} and the resolution failed
250248
*/
251-
HotSpotResolvedJavaType lookupType(String name, HotSpotResolvedObjectTypeImpl accessingClass, boolean resolve) throws ClassNotFoundException {
252-
return lookupType(name, accessingClass, accessingClass != null ? accessingClass.getKlassPointer() : 0L, resolve);
249+
HotSpotResolvedJavaType lookupType(String name, HotSpotResolvedObjectTypeImpl accessingClass, boolean resolve) throws NoClassDefFoundError {
250+
return lookupType(name, accessingClass, accessingClass.getKlassPointer(), -1, resolve);
253251
}
254252

255-
private native HotSpotResolvedJavaType lookupType(String name, HotSpotResolvedObjectTypeImpl accessingClass, long klassPointer, boolean resolve) throws ClassNotFoundException;
253+
/**
254+
* Converts a name to a type.
255+
*
256+
* @param classLoader the class loader to use for resolution. Must not be {@code null},
257+
* {@link ClassLoader#getPlatformClassLoader} or {@link ClassLoader#getSystemClassLoader}
258+
* @param name a well formed Java type in {@linkplain JavaType#getName() internal} format
259+
* @return the type for {@code name}
260+
* @throws NoClassDefFoundError if resolution failed
261+
*/
262+
HotSpotResolvedJavaType lookupType(ClassLoader classLoader, String name) throws NoClassDefFoundError {
263+
int accessingClassLoader;
264+
if (classLoader == null) {
265+
accessingClassLoader = 0;
266+
} else if (classLoader == ClassLoader.getPlatformClassLoader()) {
267+
accessingClassLoader = 1;
268+
} else if (classLoader == ClassLoader.getSystemClassLoader()) {
269+
accessingClassLoader = 2;
270+
} else {
271+
throw new IllegalArgumentException("Unsupported class loader for lookup: " + classLoader);
272+
}
273+
return lookupType(name, null, 0L, accessingClassLoader, true);
274+
}
256275

276+
/**
277+
* @param accessingClassLoader ignored if {@code accessingKlassPointer != 0L}. Otherwise, the supported values are:
278+
* 0 - boot class loader
279+
* 1 - {@linkplain ClassLoader#getPlatformClassLoader() platform class loader}
280+
* 2 - {@linkplain ClassLoader#getSystemClassLoader() system class loader}
281+
*/
282+
private native HotSpotResolvedJavaType lookupType(String name, HotSpotResolvedObjectTypeImpl accessingClass, long accessingKlassPointer, int accessingClassLoader, boolean resolve) throws NoClassDefFoundError;
283+
284+
/**
285+
* Converts {@code javaClass} to a HotSpotResolvedJavaType.
286+
*
287+
* Must not be called if {@link Services#IS_IN_NATIVE_IMAGE} is {@code true}.
288+
*/
257289
native HotSpotResolvedJavaType lookupClass(Class<?> javaClass);
258290

259291
native HotSpotResolvedJavaType lookupJClass(long jclass);

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -627,11 +627,7 @@ HotSpotResolvedJavaType createClass(Class<?> javaClass) {
627627
return HotSpotResolvedPrimitiveType.forKind(JavaKind.fromJavaClass(javaClass));
628628
}
629629
if (IS_IN_NATIVE_IMAGE) {
630-
try {
631-
return compilerToVm.lookupType(javaClass.getName().replace('.', '/'), null, true);
632-
} catch (ClassNotFoundException e) {
633-
throw new JVMCIError(e);
634-
}
630+
return compilerToVm.lookupType(javaClass.getClassLoader(), javaClass.getName().replace('.', '/'));
635631
}
636632
return compilerToVm.lookupClass(javaClass);
637633
}
@@ -869,17 +865,13 @@ JavaType lookupTypeInternal(String name, HotSpotResolvedObjectType accessingType
869865

870866
// Resolve non-primitive types in the VM.
871867
HotSpotResolvedObjectTypeImpl hsAccessingType = (HotSpotResolvedObjectTypeImpl) accessingType;
872-
try {
873-
final HotSpotResolvedJavaType klass = compilerToVm.lookupType(name, hsAccessingType, resolve);
868+
final HotSpotResolvedJavaType klass = compilerToVm.lookupType(name, hsAccessingType, resolve);
874869

875-
if (klass == null) {
876-
assert resolve == false : name;
877-
return UnresolvedJavaType.create(name);
878-
}
879-
return klass;
880-
} catch (ClassNotFoundException e) {
881-
throw (NoClassDefFoundError) new NoClassDefFoundError().initCause(e);
870+
if (klass == null) {
871+
assert resolve == false : name;
872+
return UnresolvedJavaType.create(name);
882873
}
874+
return klass;
883875
}
884876

885877
/**

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,26 +77,27 @@ private static ResolvedJavaField findFieldInClass(ResolvedJavaType declaringType
7777
throw new NoSuchFieldError(declaringType + "." + fieldName);
7878
}
7979

80-
private static ResolvedJavaType resolveType(String className) {
81-
return (ResolvedJavaType) runtime().lookupTypeInternal(className, null, true);
80+
private static ResolvedJavaType resolveType(String className, HotSpotResolvedObjectType accessingType) {
81+
return (ResolvedJavaType) runtime().lookupTypeInternal(className, accessingType, true);
8282
}
8383

8484
private Internals() {
8585
try {
86-
ResolvedJavaType methodHandleType = resolveType("Ljava/lang/invoke/MethodHandle;");
87-
ResolvedJavaType memberNameType = resolveType("Ljava/lang/invoke/MemberName;");
88-
lambdaFormType = resolveType("Ljava/lang/invoke/LambdaForm;");
86+
HotSpotResolvedObjectType accessingType = runtime().getJavaLangObject();
87+
ResolvedJavaType methodHandleType = resolveType("Ljava/lang/invoke/MethodHandle;", accessingType);
88+
ResolvedJavaType memberNameType = resolveType("Ljava/lang/invoke/MemberName;", accessingType);
89+
lambdaFormType = resolveType("Ljava/lang/invoke/LambdaForm;", accessingType);
8990
methodHandleFormField = findFieldInClass(methodHandleType, "form", lambdaFormType);
9091
lambdaFormVmentryField = findFieldInClass(lambdaFormType, "vmentry", memberNameType);
9192

92-
ResolvedJavaType methodType = resolveType("Ljava/lang/invoke/ResolvedMethodName;");
93+
ResolvedJavaType methodType = resolveType("Ljava/lang/invoke/ResolvedMethodName;", accessingType);
9394
methodField = findFieldInClass(memberNameType, "method", methodType);
94-
vmtargetField = (HotSpotResolvedJavaField) findFieldInClass(methodType, "vmtarget", resolveType(Character.toString(HotSpotJVMCIRuntime.getHostWordKind().getTypeChar())));
95+
vmtargetField = (HotSpotResolvedJavaField) findFieldInClass(methodType, "vmtarget", resolveType(Character.toString(HotSpotJVMCIRuntime.getHostWordKind().getTypeChar()), accessingType));
9596

96-
ResolvedJavaType callSiteType = resolveType("Ljava/lang/invoke/CallSite;");
97+
ResolvedJavaType callSiteType = resolveType("Ljava/lang/invoke/CallSite;", accessingType);
9798
callSiteTargetField = (HotSpotResolvedJavaField) findFieldInClass(callSiteType, "target", methodHandleType);
98-
ResolvedJavaType constantCallSiteType = resolveType("Ljava/lang/invoke/ConstantCallSite;");
99-
ResolvedJavaType booleanType = resolveType("Z");
99+
ResolvedJavaType constantCallSiteType = resolveType("Ljava/lang/invoke/ConstantCallSite;", accessingType);
100+
ResolvedJavaType booleanType = resolveType("Z", accessingType);
100101
constantCallSiteFrozenField = (HotSpotResolvedJavaField) findFieldInClass(constantCallSiteType, "isFrozen", booleanType);
101102
} catch (Throwable ex) {
102103
throw new JVMCIError(ex);

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/SharedLibraryJVMCIReflection.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -188,16 +188,8 @@ <T extends Annotation> T getFieldAnnotation(HotSpotResolvedJavaFieldImpl javaFie
188188
HotSpotResolvedObjectTypeImpl getType(HotSpotObjectConstantImpl object) {
189189
if (object instanceof DirectHotSpotObjectConstantImpl) {
190190
Class<?> theClass = ((DirectHotSpotObjectConstantImpl) object).object.getClass();
191-
try {
192-
String name = theClass.getName().replace('.', '/');
193-
HotSpotResolvedObjectTypeImpl type = (HotSpotResolvedObjectTypeImpl) runtime().compilerToVm.lookupType(name, null, true);
194-
if (type == null) {
195-
throw new InternalError(name);
196-
}
197-
return type;
198-
} catch (ClassNotFoundException e) {
199-
throw new InternalError(e);
200-
}
191+
String name = theClass.getName().replace('.', '/');
192+
return (HotSpotResolvedObjectTypeImpl) runtime().compilerToVm.lookupType(theClass.getClassLoader(), name);
201193
}
202194
return runtime().compilerToVm.getResolvedJavaType(object, runtime().getConfig().hubOffset, false);
203195
}

0 commit comments

Comments
 (0)