Skip to content

Commit 74ac5df

Browse files
author
Doug Simon
committedJul 13, 2022
8290234: [JVMCI] use JVMCIKlassHandle to protect raw Klass* values from concurrent G1 scanning
Reviewed-by: kvn, never
1 parent 5e3ecff commit 74ac5df

File tree

3 files changed

+16
-13
lines changed

3 files changed

+16
-13
lines changed
 

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

+9-2
Original file line numberDiff line numberDiff line change
@@ -880,8 +880,15 @@ HotSpotResolvedObjectTypeImpl getResolvedJavaType(HotSpotObjectConstantImpl base
880880
return getResolvedJavaType0(base, displacement, compressed);
881881
}
882882

883-
HotSpotResolvedObjectTypeImpl getResolvedJavaType(long displacement, boolean compressed) {
884-
return getResolvedJavaType0(null, displacement, compressed);
883+
/**
884+
* Reads a {@code Klass*} from {@code address} (i.e., {@code address} is a {@code Klass**}
885+
* value) and wraps it in a {@link HotSpotResolvedObjectTypeImpl}. This VM call must be used for
886+
* any {@code Klass*} value not known to be already wrapped in a
887+
* {@link HotSpotResolvedObjectTypeImpl}. The VM call is necessary so that the {@code Klass*} is
888+
* wrapped in a {@code JVMCIKlassHandle} to protect it from the concurrent scanning done by G1.
889+
*/
890+
HotSpotResolvedObjectTypeImpl getResolvedJavaType(long address) {
891+
return getResolvedJavaType0(null, address, false);
885892
}
886893

887894
/**

‎src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMethodData.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -308,11 +308,7 @@ private HotSpotResolvedJavaMethod readMethod(int position, int offsetInBytes) {
308308

309309
private HotSpotResolvedObjectTypeImpl readKlass(int position, int offsetInBytes) {
310310
long fullOffsetInBytes = state.computeFullOffset(position, offsetInBytes);
311-
long klassPointer = UNSAFE.getAddress(methodDataPointer + fullOffsetInBytes);
312-
if (klassPointer == 0) {
313-
return null;
314-
}
315-
return runtime().fromMetaspace(klassPointer);
311+
return compilerToVM().getResolvedJavaType(methodDataPointer + fullOffsetInBytes);
316312
}
317313

318314
/**

‎src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.lang.reflect.Executable;
3636
import java.lang.reflect.Modifier;
3737
import java.lang.reflect.Type;
38+
import java.util.Objects;
3839

3940
import jdk.vm.ci.common.JVMCIError;
4041
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
@@ -89,12 +90,11 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
8990
*/
9091
private static HotSpotResolvedObjectTypeImpl getHolder(long metaspaceHandle) {
9192
HotSpotVMConfig config = config();
92-
long metaspaceMethod = UNSAFE.getLong(metaspaceHandle);
93-
assert metaspaceMethod != 0 : metaspaceHandle;
94-
final long metaspaceConstMethod = UNSAFE.getAddress(metaspaceMethod + config.methodConstMethodOffset);
95-
final long metaspaceConstantPool = UNSAFE.getAddress(metaspaceConstMethod + config.constMethodConstantsOffset);
96-
long klassPointer = UNSAFE.getAddress(metaspaceConstantPool + config.constantPoolHolderOffset);
97-
return runtime().fromMetaspace(klassPointer);
93+
long methodPointer = UNSAFE.getLong(metaspaceHandle);
94+
assert methodPointer != 0 : metaspaceHandle;
95+
final long constMethodPointer = UNSAFE.getAddress(methodPointer + config.methodConstMethodOffset);
96+
final long constantPoolPointer = UNSAFE.getAddress(constMethodPointer + config.constMethodConstantsOffset);
97+
return Objects.requireNonNull(compilerToVM().getResolvedJavaType(constantPoolPointer + config.constantPoolHolderOffset));
9898
}
9999

100100
/**

1 commit comments

Comments
 (1)

openjdk-notifier[bot] commented on Jul 13, 2022

@openjdk-notifier[bot]
Please sign in to comment.