Skip to content

Commit 796593c

Browse files
committed
[GR-17828] [GR-21998] Prevent repeated initialization built-in net library.
PullRequest: graal/5861
2 parents c693f97 + f1aa5d0 commit 796593c

File tree

3 files changed

+45
-40
lines changed

3 files changed

+45
-40
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/DeoptimizationSourcePositionEncoder.java

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -48,36 +48,36 @@ public DeoptimizationSourcePositionEncoder() {
4848
this.objectConstants = FrequencyEncoder.createIdentityEncoder();
4949
}
5050

51-
public void encodeAndInstall(List<NodeSourcePosition> deoptimzationSourcePositions, CodeInfo target) {
52-
addObjectConstants(deoptimzationSourcePositions);
51+
public void encodeAndInstall(List<NodeSourcePosition> deoptSourcePositions, CodeInfo target, ReferenceAdjuster adjuster) {
52+
addObjectConstants(deoptSourcePositions);
5353
Object[] encodedObjectConstants = objectConstants.encodeAll(new Object[objectConstants.getLength()]);
5454

5555
UnsafeArrayTypeWriter encodingBuffer = UnsafeArrayTypeWriter.create(ByteArrayReader.supportsUnalignedMemoryAccess());
5656
EconomicMap<NodeSourcePosition, Long> sourcePositionStartOffsets = EconomicMap.create(Equivalence.IDENTITY_WITH_SYSTEM_HASHCODE);
57-
NonmovableArray<Integer> deoptimizationStartOffsets = NonmovableArrays.createIntArray(deoptimzationSourcePositions.size());
57+
NonmovableArray<Integer> deoptStartOffsets = NonmovableArrays.createIntArray(deoptSourcePositions.size());
5858

59-
encodeSourcePositions(deoptimzationSourcePositions, sourcePositionStartOffsets, deoptimizationStartOffsets, encodingBuffer);
60-
NonmovableArray<Byte> deoptimizationEncodings = NonmovableArrays.createByteArray(TypeConversion.asS4(encodingBuffer.getBytesWritten()));
61-
encodingBuffer.toByteBuffer(NonmovableArrays.asByteBuffer(deoptimizationEncodings));
59+
encodeSourcePositions(deoptSourcePositions, sourcePositionStartOffsets, deoptStartOffsets, encodingBuffer);
60+
NonmovableArray<Byte> deoptEncodings = NonmovableArrays.createByteArray(TypeConversion.asS4(encodingBuffer.getBytesWritten()));
61+
encodingBuffer.toByteBuffer(NonmovableArrays.asByteBuffer(deoptEncodings));
6262

63-
install(target, deoptimizationStartOffsets, deoptimizationEncodings, encodedObjectConstants, deoptimzationSourcePositions);
63+
install(target, deoptStartOffsets, deoptEncodings, encodedObjectConstants, deoptSourcePositions, adjuster);
6464
}
6565

6666
@Uninterruptible(reason = "Nonmovable object arrays are not visible to GC until installed in target.")
67-
private static void install(CodeInfo target, NonmovableArray<Integer> deoptimizationStartOffsets, NonmovableArray<Byte> deoptimizationEncodings,
68-
Object[] encodedObjectConstants, List<NodeSourcePosition> deoptimizationSourcePositions) {
67+
private static void install(CodeInfo target, NonmovableArray<Integer> deoptStartOffsets, NonmovableArray<Byte> deoptEncodings,
68+
Object[] encodedObjectConstants, List<NodeSourcePosition> deoptSourcePositions, ReferenceAdjuster adjuster) {
6969

70-
NonmovableObjectArray<Object> deoptimizationObjectConstants = NonmovableArrays.copyOfObjectArray(encodedObjectConstants);
71-
RuntimeCodeInfoAccess.setDeoptimizationMetadata(target, deoptimizationStartOffsets, deoptimizationEncodings, deoptimizationObjectConstants);
70+
NonmovableObjectArray<Object> deoptObjectConstants = adjuster.copyOfObjectArray(encodedObjectConstants);
71+
RuntimeCodeInfoAccess.setDeoptimizationMetadata(target, deoptStartOffsets, deoptEncodings, deoptObjectConstants);
7272

73-
afterInstallation(deoptimizationStartOffsets, deoptimizationEncodings, deoptimizationSourcePositions, deoptimizationObjectConstants);
73+
afterInstallation(deoptStartOffsets, deoptEncodings, deoptSourcePositions, deoptObjectConstants, adjuster);
7474
}
7575

7676
@Uninterruptible(reason = "Safe for GC, but called from uninterruptible code.", calleeMustBe = false)
77-
private static void afterInstallation(NonmovableArray<Integer> deoptimizationStartOffsets, NonmovableArray<Byte> deoptimizationEncodings,
78-
List<NodeSourcePosition> deoptimizationSourcePositions, NonmovableObjectArray<Object> deoptimizationObjectConstants) {
77+
private static void afterInstallation(NonmovableArray<Integer> deoptStartOffsets, NonmovableArray<Byte> deoptEncodings,
78+
List<NodeSourcePosition> deoptSourcePositions, NonmovableObjectArray<Object> deoptObjectConstants, ReferenceAdjuster adjuster) {
7979

80-
verifyEncoding(deoptimizationSourcePositions, deoptimizationStartOffsets, deoptimizationEncodings, deoptimizationObjectConstants);
80+
assert !adjuster.isFinished() || verifyEncoding(deoptSourcePositions, deoptStartOffsets, deoptEncodings, deoptObjectConstants);
8181
}
8282

8383
private void addObjectConstants(List<NodeSourcePosition> deoptimzationSourcePositions) {
@@ -97,18 +97,18 @@ private void addObjectConstants(NodeSourcePosition sourcePosition, EconomicSet<N
9797
processedPositions.add(sourcePosition);
9898
}
9999

100-
private void encodeSourcePositions(List<NodeSourcePosition> deoptimzationSourcePositions, EconomicMap<NodeSourcePosition, Long> sourcePositionStartOffsets,
101-
NonmovableArray<Integer> deoptimizationStartOffsets, UnsafeArrayTypeWriter encodingBuffer) {
102-
for (int i = 0; i < deoptimzationSourcePositions.size(); i++) {
103-
NodeSourcePosition sourcePosition = deoptimzationSourcePositions.get(i);
100+
private void encodeSourcePositions(List<NodeSourcePosition> deoptSourcePositions, EconomicMap<NodeSourcePosition, Long> sourcePositionStartOffsets,
101+
NonmovableArray<Integer> deoptStartOffsets, UnsafeArrayTypeWriter encodingBuffer) {
102+
for (int i = 0; i < deoptSourcePositions.size(); i++) {
103+
NodeSourcePosition sourcePosition = deoptSourcePositions.get(i);
104104
int startOffset;
105105
if (sourcePosition == null) {
106106
startOffset = DeoptimizationSourcePositionDecoder.NO_SOURCE_POSITION;
107107
} else {
108108
startOffset = TypeConversion.asS4(encodeSourcePositions(sourcePosition, sourcePositionStartOffsets, encodingBuffer));
109109
assert startOffset > DeoptimizationSourcePositionDecoder.NO_SOURCE_POSITION;
110110
}
111-
NonmovableArrays.setInt(deoptimizationStartOffsets, i, startOffset);
111+
NonmovableArrays.setInt(deoptStartOffsets, i, startOffset);
112112
}
113113
}
114114

@@ -139,11 +139,12 @@ private long encodeSourcePositions(NodeSourcePosition sourcePosition, EconomicMa
139139
return startAbsoluteOffset;
140140
}
141141

142-
private static boolean verifyEncoding(List<NodeSourcePosition> deoptimzationSourcePositions, NonmovableArray<Integer> deoptimizationStartOffsets,
143-
NonmovableArray<Byte> deoptimizationEncodings, NonmovableObjectArray<Object> deoptimizationObjectConstants) {
144-
for (int i = 0; i < deoptimzationSourcePositions.size(); i++) {
145-
NodeSourcePosition originalSourcePosition = deoptimzationSourcePositions.get(i);
146-
NodeSourcePosition decodedSourcePosition = DeoptimizationSourcePositionDecoder.decode(i, deoptimizationStartOffsets, deoptimizationEncodings, deoptimizationObjectConstants);
142+
private static boolean verifyEncoding(List<NodeSourcePosition> deoptSourcePositions, NonmovableArray<Integer> deoptStartOffsets,
143+
NonmovableArray<Byte> deoptEncodings, NonmovableObjectArray<Object> deoptObjectConstants) {
144+
145+
for (int i = 0; i < deoptSourcePositions.size(); i++) {
146+
NodeSourcePosition originalSourcePosition = deoptSourcePositions.get(i);
147+
NodeSourcePosition decodedSourcePosition = DeoptimizationSourcePositionDecoder.decode(i, deoptStartOffsets, deoptEncodings, deoptObjectConstants);
147148

148149
verifySourcePosition(originalSourcePosition, decodedSourcePosition);
149150
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/NativeLibrarySupport.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ private boolean loadLibrary0(File file, boolean asBuiltin) {
141141
return addLibrary(asBuiltin, canonical, true);
142142
}
143143

144-
private boolean addLibrary(boolean asBuiltin, String canonical, boolean loadAndInitialize) {
144+
private boolean addLibrary(boolean asBuiltin, String canonical, boolean initialize) {
145145
lock.lock();
146146
try {
147147
NativeLibrary lib = null;
@@ -171,19 +171,22 @@ private boolean addLibrary(boolean asBuiltin, String canonical, boolean loadAndI
171171
lib = PlatformNativeLibrarySupport.singleton().createLibrary(canonical, asBuiltin);
172172
created = true;
173173
}
174-
if (loadAndInitialize) {
175-
currentLoadContext.push(lib);
176-
try {
177-
if (!lib.load()) {
178-
return false;
179-
}
180-
if (libraryInitializer != null) {
181-
libraryInitializer.initialize(lib);
182-
}
183-
} finally {
184-
NativeLibrary top = currentLoadContext.pop();
185-
assert top == lib;
174+
currentLoadContext.push(lib);
175+
try {
176+
if (!lib.load()) {
177+
return false;
178+
}
179+
/*
180+
* Initialization of a library must be skipped if it can be initialized at most once
181+
* per process and another isolate has already initialized it. However, the library
182+
* must be (marked as) loaded above so it cannot be loaded and initialized later.
183+
*/
184+
if (initialize && libraryInitializer != null) {
185+
libraryInitializer.initialize(lib);
186186
}
187+
} finally {
188+
NativeLibrary top = currentLoadContext.pop();
189+
assert top == lib;
187190
}
188191
if (created) {
189192
knownLibraries.add(lib);
@@ -210,6 +213,7 @@ public PointerBase findSymbol(String name) {
210213
}
211214

212215
public void registerInitializedBuiltinLibrary(String name) {
213-
addLibrary(true, name, false);
216+
boolean success = addLibrary(true, name, false);
217+
assert success;
214218
}
215219
}

substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/RuntimeCodeInstaller.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ private void createCodeChunkInfos(CodeInfo runtimeMethodInfo, ReferenceAdjuster
328328
assert !adjuster.isFinished() || codeInfoEncoder.verifyFrameInfo(runtimeMethodInfo);
329329

330330
DeoptimizationSourcePositionEncoder sourcePositionEncoder = new DeoptimizationSourcePositionEncoder();
331-
sourcePositionEncoder.encodeAndInstall(compilation.getDeoptimizationSourcePositions(), runtimeMethodInfo);
331+
sourcePositionEncoder.encodeAndInstall(compilation.getDeoptimizationSourcePositions(), runtimeMethodInfo, adjuster);
332332
}
333333

334334
private void patchData(Map<Integer, NativeImagePatcher> patcher, @SuppressWarnings("unused") ObjectConstantsHolder objectConstants) {

0 commit comments

Comments
 (0)