Skip to content

Commit 419fa40

Browse files
committed
[GR-60640] Expose CapnProtoSchemaHolder to ImageLayerSingletons.
PullRequest: graal/19661
2 parents dbcc75e + 175093c commit 419fa40

File tree

5 files changed

+109
-80
lines changed

5 files changed

+109
-80
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ struct SharedLayerSnapshot {
255255
singletonKeys @11 :List(ImageSingletonKey);
256256
singletonObjects @12 :List(ImageSingletonObject);
257257
fields @13 :List(PersistedAnalysisField);
258+
nextLayerNumber @14 :Int32;
258259
}
259260

260261
struct PrimitiveValue {

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,8 @@ public PersistFlags preparePersist(ImageSingletonWriter writer) {
186186
/*
187187
* First write out next layer number.
188188
*/
189-
writer.writeInt("nextLayerNumber", nextLayerNumber);
189+
var snapshotBuilder = ((SVMImageLayerWriter.ImageSingletonWriterImpl) writer).getSnapshotBuilder();
190+
snapshotBuilder.setNextLayerNumber(nextLayerNumber);
190191

191192
/*
192193
* Next write the start of the code section
@@ -228,7 +229,8 @@ public static Object createFromLoader(ImageSingletonLoader loader) {
228229
assert loader.readIntList("offsets").size() == loader.readIntList("methodOffsetIDs").size() : Assertions.errorMessage("Offsets and methodIDs are incompatible", loader.readIntList("offsets"),
229230
loader.readIntList("methodIDs"));
230231

231-
int layerNumber = loader.readInt("nextLayerNumber");
232+
var snapshotReader = ((SVMImageLayerSingletonLoader.ImageSingletonLoaderImpl) loader).getSnapshotReader();
233+
int layerNumber = snapshotReader.getNextLayerNumber();
232234

233235
String codeSectionStartSymbol = loader.readString("codeSectionStartSymbol");
234236

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

+38-32
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ private Map<Object, Set<Class<?>>> loadImageSingletons0(Object forbiddenObject)
8686
try {
8787
Class<?> clazz = imageLayerBuildingSupport.lookupClass(false, className);
8888
Method createMethod = ReflectionUtil.lookupMethod(clazz, "createFromLoader", ImageSingletonLoader.class);
89-
result = createMethod.invoke(null, new ImageSingletonLoaderImpl(keyStore));
89+
result = createMethod.invoke(null, new ImageSingletonLoaderImpl(keyStore, snapshot));
9090
} catch (Throwable t) {
9191
throw VMError.shouldNotReachHere("Failed to recreate image singleton", t);
9292
}
@@ -122,44 +122,50 @@ private Map<Object, Set<Class<?>>> loadImageSingletons0(Object forbiddenObject)
122122
public Class<?> lookupClass(boolean optional, String className) {
123123
return imageLayerBuildingSupport.lookupClass(optional, className);
124124
}
125-
}
126125

127-
class ImageSingletonLoaderImpl implements ImageSingletonLoader {
128-
private final UnmodifiableEconomicMap<String, Object> keyStore;
126+
public static class ImageSingletonLoaderImpl implements ImageSingletonLoader {
127+
private final UnmodifiableEconomicMap<String, Object> keyStore;
128+
private final SharedLayerSnapshotCapnProtoSchemaHolder.SharedLayerSnapshot.Reader snapshotReader;
129129

130-
ImageSingletonLoaderImpl(UnmodifiableEconomicMap<String, Object> keyStore) {
131-
this.keyStore = keyStore;
132-
}
130+
ImageSingletonLoaderImpl(UnmodifiableEconomicMap<String, Object> keyStore, SharedLayerSnapshotCapnProtoSchemaHolder.SharedLayerSnapshot.Reader snapshotReader) {
131+
this.keyStore = keyStore;
132+
this.snapshotReader = snapshotReader;
133+
}
133134

134-
@Override
135-
public List<Boolean> readBoolList(String keyName) {
136-
boolean[] l = (boolean[]) keyStore.get(keyName);
137-
return IntStream.range(0, l.length).mapToObj(i -> l[i]).toList();
138-
}
135+
@Override
136+
public List<Boolean> readBoolList(String keyName) {
137+
boolean[] l = (boolean[]) keyStore.get(keyName);
138+
return IntStream.range(0, l.length).mapToObj(i -> l[i]).toList();
139+
}
139140

140-
@Override
141-
public int readInt(String keyName) {
142-
return (int) keyStore.get(keyName);
143-
}
141+
@Override
142+
public int readInt(String keyName) {
143+
return (int) keyStore.get(keyName);
144+
}
144145

145-
@Override
146-
public List<Integer> readIntList(String keyName) {
147-
int[] l = (int[]) keyStore.get(keyName);
148-
return IntStream.of(l).boxed().toList();
149-
}
146+
@Override
147+
public List<Integer> readIntList(String keyName) {
148+
int[] l = (int[]) keyStore.get(keyName);
149+
return IntStream.of(l).boxed().toList();
150+
}
150151

151-
@Override
152-
public long readLong(String keyName) {
153-
return (long) keyStore.get(keyName);
154-
}
152+
@Override
153+
public long readLong(String keyName) {
154+
return (long) keyStore.get(keyName);
155+
}
155156

156-
@Override
157-
public String readString(String keyName) {
158-
return (String) keyStore.get(keyName);
159-
}
157+
@Override
158+
public String readString(String keyName) {
159+
return (String) keyStore.get(keyName);
160+
}
161+
162+
@Override
163+
public List<String> readStringList(String keyName) {
164+
return List.of((String[]) keyStore.get(keyName));
165+
}
160166

161-
@Override
162-
public List<String> readStringList(String keyName) {
163-
return List.of((String[]) keyStore.get(keyName));
167+
public SharedLayerSnapshotCapnProtoSchemaHolder.SharedLayerSnapshot.Reader getSnapshotReader() {
168+
return snapshotReader;
169+
}
164170
}
165171
}

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

+54-45
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,7 @@ public void writeImageSingletonInfo(List<Map.Entry<Class<?>, Object>> layeredIma
10071007
}
10081008
String key = singletonInfo.getKey().getName();
10091009
if (!singletonInfoMap.containsKey(singleton)) {
1010-
var writer = new ImageSingletonWriterImpl();
1010+
var writer = new ImageSingletonWriterImpl(snapshotBuilder);
10111011
var flags = singleton.preparePersist(writer);
10121012
boolean persistData = flags == LayeredImageSingleton.PersistFlags.CREATE;
10131013
var info = new SingletonPersistInfo(flags, persistData ? nextID++ : -1, persistData ? writer.getKeyValueStore() : null);
@@ -1069,59 +1069,68 @@ private static void writeImageSingletonKeyStore(ImageSingletonObject.Builder obj
10691069
}
10701070
}
10711071
}
1072-
}
10731072

1074-
class ImageSingletonWriterImpl implements ImageSingletonWriter {
1075-
private final EconomicMap<String, Object> keyValueStore = EconomicMap.create();
1073+
public static class ImageSingletonWriterImpl implements ImageSingletonWriter {
1074+
private final EconomicMap<String, Object> keyValueStore = EconomicMap.create();
1075+
private final SharedLayerSnapshotCapnProtoSchemaHolder.SharedLayerSnapshot.Builder snapshotBuilder;
10761076

1077-
EconomicMap<String, Object> getKeyValueStore() {
1078-
return keyValueStore;
1079-
}
1077+
ImageSingletonWriterImpl(SharedLayerSnapshotCapnProtoSchemaHolder.SharedLayerSnapshot.Builder snapshotBuilder) {
1078+
this.snapshotBuilder = snapshotBuilder;
1079+
}
10801080

1081-
private static boolean nonNullEntries(List<?> list) {
1082-
return list.stream().filter(Objects::isNull).findAny().isEmpty();
1083-
}
1081+
EconomicMap<String, Object> getKeyValueStore() {
1082+
return keyValueStore;
1083+
}
10841084

1085-
@Override
1086-
public void writeBoolList(String keyName, List<Boolean> value) {
1087-
assert nonNullEntries(value);
1088-
boolean[] b = new boolean[value.size()];
1089-
for (int i = 0; i < value.size(); i++) {
1090-
b[i] = value.get(i);
1085+
private static boolean nonNullEntries(List<?> list) {
1086+
return list.stream().filter(Objects::isNull).findAny().isEmpty();
10911087
}
1092-
var previous = keyValueStore.put(keyName, b);
1093-
assert previous == null : Assertions.errorMessage(keyName, previous);
1094-
}
10951088

1096-
@Override
1097-
public void writeInt(String keyName, int value) {
1098-
var previous = keyValueStore.put(keyName, value);
1099-
assert previous == null : previous;
1100-
}
1089+
@Override
1090+
public void writeBoolList(String keyName, List<Boolean> value) {
1091+
assert nonNullEntries(value);
1092+
boolean[] b = new boolean[value.size()];
1093+
for (int i = 0; i < value.size(); i++) {
1094+
b[i] = value.get(i);
1095+
}
1096+
var previous = keyValueStore.put(keyName, b);
1097+
assert previous == null : Assertions.errorMessage(keyName, previous);
1098+
}
11011099

1102-
@Override
1103-
public void writeIntList(String keyName, List<Integer> value) {
1104-
assert nonNullEntries(value);
1105-
var previous = keyValueStore.put(keyName, value.stream().mapToInt(i -> i).toArray());
1106-
assert previous == null : Assertions.errorMessage(keyName, previous);
1107-
}
1100+
@Override
1101+
public void writeInt(String keyName, int value) {
1102+
var previous = keyValueStore.put(keyName, value);
1103+
assert previous == null : previous;
1104+
}
11081105

1109-
@Override
1110-
public void writeLong(String keyName, long value) {
1111-
var previous = keyValueStore.put(keyName, value);
1112-
assert previous == null : Assertions.errorMessage(keyName, previous);
1113-
}
1106+
@Override
1107+
public void writeIntList(String keyName, List<Integer> value) {
1108+
assert nonNullEntries(value);
1109+
var previous = keyValueStore.put(keyName, value.stream().mapToInt(i -> i).toArray());
1110+
assert previous == null : Assertions.errorMessage(keyName, previous);
1111+
}
11141112

1115-
@Override
1116-
public void writeString(String keyName, String value) {
1117-
var previous = keyValueStore.put(keyName, value);
1118-
assert previous == null : Assertions.errorMessage(keyName, previous);
1119-
}
1113+
@Override
1114+
public void writeLong(String keyName, long value) {
1115+
var previous = keyValueStore.put(keyName, value);
1116+
assert previous == null : Assertions.errorMessage(keyName, previous);
1117+
}
11201118

1121-
@Override
1122-
public void writeStringList(String keyName, List<String> value) {
1123-
assert nonNullEntries(value);
1124-
var previous = keyValueStore.put(keyName, value.toArray(String[]::new));
1125-
assert previous == null : Assertions.errorMessage(keyName, previous);
1119+
@Override
1120+
public void writeString(String keyName, String value) {
1121+
var previous = keyValueStore.put(keyName, value);
1122+
assert previous == null : Assertions.errorMessage(keyName, previous);
1123+
}
1124+
1125+
@Override
1126+
public void writeStringList(String keyName, List<String> value) {
1127+
assert nonNullEntries(value);
1128+
var previous = keyValueStore.put(keyName, value.toArray(String[]::new));
1129+
assert previous == null : Assertions.errorMessage(keyName, previous);
1130+
}
1131+
1132+
public SharedLayerSnapshotCapnProtoSchemaHolder.SharedLayerSnapshot.Builder getSnapshotBuilder() {
1133+
return snapshotBuilder;
1134+
}
11261135
}
11271136
}

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

+12-1
Original file line numberDiff line numberDiff line change
@@ -4317,7 +4317,7 @@ public final org.capnproto.StructList.Reader<com.oracle.svm.hosted.imagelayer.Sh
43174317

43184318

43194319
public static class SharedLayerSnapshot {
4320-
public static final org.capnproto.StructSize STRUCT_SIZE = new org.capnproto.StructSize((short)4,(short)7);
4320+
public static final org.capnproto.StructSize STRUCT_SIZE = new org.capnproto.StructSize((short)5,(short)7);
43214321
public static final class Factory extends org.capnproto.StructFactory<Builder, Reader> {
43224322
public Factory() {
43234323
}
@@ -4477,6 +4477,13 @@ public final void setFields(org.capnproto.StructList.Reader<com.oracle.svm.hoste
44774477
public final org.capnproto.StructList.Builder<com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedAnalysisField.Builder> initFields(int size) {
44784478
return _initPointerField(com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedAnalysisField.listFactory, 6, size);
44794479
}
4480+
public final int getNextLayerNumber() {
4481+
return _getIntField(8);
4482+
}
4483+
public final void setNextLayerNumber(int value) {
4484+
_setIntField(8, value);
4485+
}
4486+
44804487
}
44814488

44824489
public static final class Reader extends org.capnproto.StructReader {
@@ -4561,6 +4568,10 @@ public final org.capnproto.StructList.Reader<com.oracle.svm.hosted.imagelayer.Sh
45614568
return _getPointerField(com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedAnalysisField.listFactory, 6, null, 0);
45624569
}
45634570

4571+
public final int getNextLayerNumber() {
4572+
return _getIntField(8);
4573+
}
4574+
45644575
}
45654576

45664577
}

0 commit comments

Comments
 (0)