Skip to content

Commit 5be0eee

Browse files
teshullZeavee
authored andcommitted
prototype full support for InitialLayerOnly image singletons when the key differs from the implementation
1 parent 17fe52a commit 5be0eee

File tree

7 files changed

+49
-25
lines changed

7 files changed

+49
-25
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingletonSupport.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,7 @@ static LayeredImageSingletonSupport singleton() {
5353

5454
void freezeLayeredImageSingletonMetadata();
5555

56+
boolean isInitialLayerOnlyImageSingleton(Class<?> key);
57+
5658
JavaConstant getInitialLayerOnlyImageSingleton(Class<?> key);
5759
}

substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ struct ImageSingletonKey {
228228
persistFlag @1 :Int32;
229229
objectId @2 :SingletonObjId;
230230
constantId @3 :ConstantId;
231+
isInitialLayerOnly @4 :Bool;
231232
}
232233

233234
struct ImageSingletonObject {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageSingletonsSupportImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ public void freezeLayeredImageSingletonMetadata() {
8282
HostedManagement.getAndAssertExists().freezeLayeredImageSingletonMetadata();
8383
}
8484

85+
@Override
86+
public boolean isInitialLayerOnlyImageSingleton(Class<?> key) {
87+
var loader = HostedImageLayerBuildingSupport.singleton().getSingletonLoader();
88+
return loader.isInitialLayerOnlyImageSingleton(key);
89+
}
90+
8591
@Override
8692
public JavaConstant getInitialLayerOnlyImageSingleton(Class<?> key) {
8793
var loader = HostedImageLayerBuildingSupport.singleton().getSingletonLoader();

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerSingletonLoader.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,17 @@
3636
import java.util.stream.Stream;
3737
import java.util.stream.StreamSupport;
3838

39-
import com.oracle.svm.shaded.org.capnproto.Text;
4039
import org.graalvm.collections.EconomicMap;
4140
import org.graalvm.collections.UnmodifiableEconomicMap;
4241

4342
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
44-
import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton;
4543
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags;
4644
import com.oracle.svm.core.util.UserError;
4745
import com.oracle.svm.core.util.VMError;
4846
import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.ImageSingletonKey;
4947
import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.ImageSingletonObject;
5048
import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.KeyStoreEntry;
49+
import com.oracle.svm.shaded.org.capnproto.Text;
5150
import com.oracle.svm.util.ReflectionUtil;
5251

5352
import jdk.vm.ci.meta.JavaConstant;
@@ -112,11 +111,9 @@ public Map<Object, Set<Class<?>>> loadImageSingletons(Object forbiddenObject) {
112111
Class<?> clazz = imageLayerBuildingSupport.lookupClass(false, className);
113112
singletonInitializationMap.computeIfAbsent(forbiddenObject, (k) -> new HashSet<>());
114113
singletonInitializationMap.get(forbiddenObject).add(clazz);
115-
if (InitialLayerOnlyImageSingleton.class.isAssignableFrom(clazz)) {
114+
if (entry.getIsInitialLayerOnly()) {
116115
int constantId = entry.getConstantId();
117-
if (constantId != -1) {
118-
initialLayerKeyToIdMap.put(clazz, constantId);
119-
}
116+
initialLayerKeyToIdMap.put(clazz, constantId);
120117
}
121118
} else {
122119
assert persistInfo == PersistFlags.NOTHING : "Unexpected PersistFlags value: " + persistInfo;
@@ -129,6 +126,10 @@ public Map<Object, Set<Class<?>>> loadImageSingletons(Object forbiddenObject) {
129126
return singletonInitializationMap;
130127
}
131128

129+
public boolean isInitialLayerOnlyImageSingleton(Class<?> key) {
130+
return initialLayerOnlySingletonConstantIds.containsKey(key);
131+
}
132+
132133
public JavaConstant loadInitialLayerOnlyImageSingleton(Class<?> key) {
133134
int constantId = initialLayerOnlySingletonConstantIds.getOrDefault(key, -1);
134135
if (constantId != -1) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,7 @@ public void writeImageSingletonInfo(List<Map.Entry<Class<?>, Object>> layeredIma
11141114
constantId = initialLayerOnlySingletonMap.getOrDefault(initialLayerOnlyImageSingleton, -1);
11151115
}
11161116
sb.setConstantId(constantId);
1117+
sb.setIsInitialLayerOnly(singleton instanceof InitialLayerOnlyImageSingleton);
11171118
}
11181119

11191120
var sortedByIDs = singletonInfoMap.entrySet().stream()

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SharedLayerSnapshotCapnProtoSchemaHolder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3937,6 +3937,13 @@ public final void setConstantId(int value) {
39373937
_setIntField(2, value);
39383938
}
39393939

3940+
public final boolean getIsInitialLayerOnly() {
3941+
return _getBooleanField(96);
3942+
}
3943+
public final void setIsInitialLayerOnly(boolean value) {
3944+
_setBooleanField(96, value);
3945+
}
3946+
39403947
}
39413948

39423949
public static final class Reader extends com.oracle.svm.shaded.org.capnproto.StructReader {
@@ -3963,6 +3970,10 @@ public final int getConstantId() {
39633970
return _getIntField(2);
39643971
}
39653972

3973+
public final boolean getIsInitialLayerOnly() {
3974+
return _getBooleanField(96);
3975+
}
3976+
39663977
}
39673978

39683979
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@
9191
import com.oracle.svm.core.imagelayer.LoadImageSingletonFactory;
9292
import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry;
9393
import com.oracle.svm.core.layeredimagesingleton.ApplicationLayerOnlyImageSingleton;
94-
import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton;
9594
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
9695
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
9796
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport;
@@ -1206,27 +1205,30 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
12061205
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unused, ValueNode classNode) {
12071206
Class<?> key = constantObjectParameter(b, targetMethod, 0, Class.class, classNode);
12081207

1209-
if (ApplicationLayerOnlyImageSingleton.isAssignableFrom(key) &&
1210-
ImageLayerBuildingSupport.buildingSharedLayer()) {
1211-
/*
1212-
* This singleton is only installed in the application layer heap. All other
1213-
* layers looks refer to this singleton.
1214-
*/
1215-
b.addPush(JavaKind.Object, LoadImageSingletonFactory.loadApplicationOnlyImageSingleton(key, b.getMetaAccess()));
1216-
return true;
1217-
}
1208+
var layeredSingletonSupport = LayeredImageSingletonSupport.singleton();
1209+
if (ImageLayerBuildingSupport.buildingImageLayer()) {
1210+
if (ApplicationLayerOnlyImageSingleton.isAssignableFrom(key) &&
1211+
ImageLayerBuildingSupport.buildingSharedLayer()) {
1212+
/*
1213+
* This singleton is only installed in the application layer heap. All other
1214+
* layers looks refer to this singleton.
1215+
*/
1216+
b.addPush(JavaKind.Object, LoadImageSingletonFactory.loadApplicationOnlyImageSingleton(key, b.getMetaAccess()));
1217+
return true;
1218+
}
12181219

1219-
if (InitialLayerOnlyImageSingleton.class.isAssignableFrom(key) && ImageLayerBuildingSupport.buildingExtensionLayer()) {
1220-
/*
1221-
* This singleton is only installed in the initial layer heap. When allowed, all
1222-
* other layers lookups refer to this singleton.
1223-
*/
1224-
JavaConstant initialSingleton = LayeredImageSingletonSupport.singleton().getInitialLayerOnlyImageSingleton(key);
1225-
b.addPush(JavaKind.Object, ConstantNode.forConstant(initialSingleton, b.getMetaAccess(), b.getGraph()));
1226-
return true;
1220+
if (ImageLayerBuildingSupport.buildingExtensionLayer() && layeredSingletonSupport.isInitialLayerOnlyImageSingleton(key)) {
1221+
/*
1222+
* This singleton is only installed in the initial layer heap. When allowed,
1223+
* all other layers lookups refer to this singleton.
1224+
*/
1225+
JavaConstant initialSingleton = layeredSingletonSupport.getInitialLayerOnlyImageSingleton(key);
1226+
b.addPush(JavaKind.Object, ConstantNode.forConstant(initialSingleton, b.getMetaAccess(), b.getGraph()));
1227+
return true;
1228+
}
12271229
}
12281230

1229-
Object singleton = LayeredImageSingletonSupport.singleton().lookup(key, true, true);
1231+
Object singleton = layeredSingletonSupport.lookup(key, true, true);
12301232
if (singleton instanceof LayeredImageSingleton layeredSingleton) {
12311233
if (!layeredSingleton.getImageBuilderFlags().contains(LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS)) {
12321234
/*

0 commit comments

Comments
 (0)