Skip to content

Commit e4f5c5d

Browse files
committed
Switch all singletons with persist actions to SingletonTraits.
1 parent 9cd6174 commit e4f5c5d

24 files changed

+928
-730
lines changed

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

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import static com.oracle.svm.core.util.VMError.shouldNotReachHereUnexpectedInput;
2929

3030
import java.util.BitSet;
31-
import java.util.EnumSet;
3231
import java.util.Objects;
3332
import java.util.TreeMap;
3433
import java.util.function.Consumer;
@@ -70,12 +69,18 @@
7069
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
7170
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
7271
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
73-
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
7472
import com.oracle.svm.core.meta.SharedField;
7573
import com.oracle.svm.core.meta.SharedMethod;
7674
import com.oracle.svm.core.meta.SharedType;
7775
import com.oracle.svm.core.nmt.NmtCategory;
7876
import com.oracle.svm.core.option.HostedOptionKey;
77+
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
78+
import com.oracle.svm.core.traits.SingletonLayeredCallbacks;
79+
import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier;
80+
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
81+
import com.oracle.svm.core.traits.SingletonTrait;
82+
import com.oracle.svm.core.traits.SingletonTraitKind;
83+
import com.oracle.svm.core.traits.SingletonTraits;
7984
import com.oracle.svm.core.util.ByteArrayReader;
8085
import com.oracle.svm.core.util.Counter;
8186
import com.oracle.svm.core.util.VMError;
@@ -909,7 +914,8 @@ private static ValueInfo findActualValue(ValueInfo[] actualObject, UnsignedWord
909914
}
910915

911916
@AutomaticallyRegisteredImageSingleton(onlyWith = BuildingImageLayerPredicate.class)
912-
class MethodTableFirstIDTracker implements LayeredImageSingleton {
917+
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = MethodTableFirstIDTracker.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
918+
class MethodTableFirstIDTracker {
913919
public final int startingID;
914920
public int nextStartingId = -1;
915921

@@ -925,21 +931,31 @@ private MethodTableFirstIDTracker(int id) {
925931
startingID = id;
926932
}
927933

928-
@Override
929-
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
930-
return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY;
931-
}
934+
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {
935+
@Override
936+
public SingletonTrait getLayeredCallbacksTrait() {
937+
return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<MethodTableFirstIDTracker>() {
938+
@Override
939+
public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, MethodTableFirstIDTracker singleton) {
940+
int nextStartingId = singleton.nextStartingId;
941+
assert nextStartingId > 0 : nextStartingId;
942+
writer.writeInt("startingID", nextStartingId);
943+
return LayeredImageSingleton.PersistFlags.CREATE;
944+
}
932945

933-
@Override
934-
public PersistFlags preparePersist(ImageSingletonWriter writer) {
935-
assert nextStartingId > 0 : nextStartingId;
936-
writer.writeInt("startingID", nextStartingId);
937-
return PersistFlags.CREATE;
946+
@Override
947+
public Class<? extends SingletonLayeredCallbacks.LayeredSingletonInstantiator<?>> getSingletonInstantiator() {
948+
return SingletonInstantiator.class;
949+
}
950+
});
951+
}
938952
}
939953

940-
@SuppressWarnings("unused")
941-
public static Object createFromLoader(ImageSingletonLoader loader) {
942-
return new MethodTableFirstIDTracker(loader.readInt("startingID"));
954+
static class SingletonInstantiator implements SingletonLayeredCallbacks.LayeredSingletonInstantiator<MethodTableFirstIDTracker> {
955+
@Override
956+
public MethodTableFirstIDTracker createFromLoader(ImageSingletonLoader loader) {
957+
return new MethodTableFirstIDTracker(loader.readInt("startingID"));
958+
}
943959
}
944960
}
945961

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/KnownOffsets.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
import java.lang.reflect.Field;
2828
import java.util.Arrays;
29-
import java.util.EnumSet;
3029
import java.util.function.Predicate;
3130

3231
import org.graalvm.nativeimage.ImageSingletons;
@@ -40,7 +39,13 @@
4039
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
4140
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
4241
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
43-
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
42+
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
43+
import com.oracle.svm.core.traits.SingletonLayeredCallbacks;
44+
import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier;
45+
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
46+
import com.oracle.svm.core.traits.SingletonTrait;
47+
import com.oracle.svm.core.traits.SingletonTraitKind;
48+
import com.oracle.svm.core.traits.SingletonTraits;
4449
import com.oracle.svm.core.util.VMError;
4550

4651
import jdk.graal.compiler.api.replacements.Fold;
@@ -157,28 +162,38 @@ public int getImageCodeInfoCodeStartOffset() {
157162
return imageCodeInfoCodeStartOffset;
158163
}
159164

160-
static class PriorKnownOffsets implements LayeredImageSingleton {
165+
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = PriorKnownOffsets.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
166+
static class PriorKnownOffsets {
161167
final int[] priorValues;
162168

163169
PriorKnownOffsets(int[] priorValues) {
164170
this.priorValues = priorValues;
165171
}
166172

167-
@Override
168-
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
169-
return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY;
170-
}
171-
172-
@Override
173-
public PersistFlags preparePersist(ImageSingletonWriter writer) {
174-
writer.writeIntList("priorValues", Arrays.stream(priorValues).boxed().toList());
175-
return PersistFlags.CREATE;
173+
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {
174+
@Override
175+
public SingletonTrait getLayeredCallbacksTrait() {
176+
return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<PriorKnownOffsets>() {
177+
@Override
178+
public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, PriorKnownOffsets singleton) {
179+
writer.writeIntList("priorValues", Arrays.stream(singleton.priorValues).boxed().toList());
180+
return LayeredImageSingleton.PersistFlags.CREATE;
181+
}
182+
183+
@Override
184+
public Class<? extends SingletonLayeredCallbacks.LayeredSingletonInstantiator<?>> getSingletonInstantiator() {
185+
return SingletonInstantiator.class;
186+
}
187+
});
188+
}
176189
}
177190

178-
@SuppressWarnings("unused")
179-
public static Object createFromLoader(ImageSingletonLoader loader) {
180-
int[] priorValues = loader.readIntList("priorValues").stream().mapToInt(e -> e).toArray();
181-
return new PriorKnownOffsets(priorValues);
191+
static class SingletonInstantiator implements SingletonLayeredCallbacks.LayeredSingletonInstantiator<PriorKnownOffsets> {
192+
@Override
193+
public PriorKnownOffsets createFromLoader(ImageSingletonLoader loader) {
194+
int[] priorValues = loader.readIntList("priorValues").stream().mapToInt(e -> e).toArray();
195+
return new PriorKnownOffsets(priorValues);
196+
}
182197
}
183198
}
184199
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/imagelayer/ImageLayerSection.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.graalvm.word.Pointer;
3030

3131
import com.oracle.svm.core.c.CGlobalData;
32-
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
3332

3433
import jdk.graal.compiler.api.replacements.Fold;
3534

@@ -38,7 +37,7 @@
3837
* contains the addresses of various important locations and information about values to patch at
3938
* runtime. See {@code ImageLayerSectionFeature} for details.
4039
*/
41-
public abstract class ImageLayerSection implements LayeredImageSingleton {
40+
public abstract class ImageLayerSection {
4241

4342
protected final CGlobalData<Pointer> initialSectionStart;
4443
protected final CGlobalData<WordPointer> cachedImageFDs;

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,14 @@
3434
import org.graalvm.nativeimage.Platform;
3535
import org.graalvm.nativeimage.Platforms;
3636

37-
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
3837
import com.oracle.svm.core.util.UserError;
3938

4039
/**
4140
* This singleton keeps track of the {@code Module#openPackages} and {@code Module#exportedPackages}
4241
* from all image layers.
4342
*/
4443
@Platforms(Platform.HOSTED_ONLY.class)
45-
public abstract class LayeredModuleSingleton implements LayeredImageSingleton {
44+
public abstract class LayeredModuleSingleton {
4645
public static final String ALL_UNNAMED_MODULE_NAME = "native-image-all-unnamed";
4746
public static final String EVERYONE_MODULE_NAME = "native-image-everyone";
4847

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

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.lang.reflect.Field;
2828
import java.util.ArrayList;
2929
import java.util.Arrays;
30-
import java.util.EnumSet;
3130
import java.util.IdentityHashMap;
3231
import java.util.List;
3332
import java.util.Set;
@@ -46,20 +45,26 @@
4645
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
4746
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
4847
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
49-
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
5048
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport;
5149
import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton;
5250
import com.oracle.svm.core.traits.BuiltinTraits.AllAccess;
51+
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
5352
import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks;
5453
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
5554
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
55+
import com.oracle.svm.core.traits.SingletonLayeredCallbacks;
56+
import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier;
57+
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
5658
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
5759
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.MultiLayer;
60+
import com.oracle.svm.core.traits.SingletonTrait;
61+
import com.oracle.svm.core.traits.SingletonTraitKind;
5862
import com.oracle.svm.core.traits.SingletonTraits;
5963
import com.oracle.svm.util.ReflectionUtil;
6064

6165
@AutomaticallyRegisteredImageSingleton
62-
public final class StringInternSupport implements LayeredImageSingleton {
66+
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = StringInternSupport.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
67+
public final class StringInternSupport {
6368

6469
interface SetGenerator {
6570
Set<String> generateSet();
@@ -76,11 +81,7 @@ public static Field getInternedStringsField() {
7681

7782
@Platforms(Platform.HOSTED_ONLY.class)
7883
public StringInternSupport() {
79-
this(Set.of());
80-
}
81-
82-
private StringInternSupport(Object obj) {
83-
this.priorLayersInternedStrings = obj;
84+
this.priorLayersInternedStrings = Set.of();
8485
}
8586

8687
@Platforms(Platform.HOSTED_ONLY.class)
@@ -167,27 +168,27 @@ public static Object getImageInternedStrings() {
167168
return LayeredImageSingletonSupport.singleton().lookup(ImageInternedStrings.class, false, true);
168169
}
169170

170-
@Override
171-
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
172-
return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY;
173-
}
171+
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {
172+
@Override
173+
public SingletonTrait getLayeredCallbacksTrait() {
174+
return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<StringInternSupport>() {
175+
@Override
176+
public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, StringInternSupport singleton) {
177+
// This can be switched to use constant ids in the future
178+
List<String> newPriorInternedStrings = new ArrayList<>(singleton.internedStringsIdentityMap.size());
174179

175-
@Override
176-
public PersistFlags preparePersist(ImageSingletonWriter writer) {
177-
// This can be switched to use constant ids in the future
178-
List<String> newPriorInternedStrings = new ArrayList<>(internedStringsIdentityMap.size());
180+
newPriorInternedStrings.addAll(singleton.internedStringsIdentityMap.keySet());
179181

180-
newPriorInternedStrings.addAll(internedStringsIdentityMap.keySet());
182+
writer.writeStringList("internedStrings", newPriorInternedStrings);
183+
return LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION;
184+
}
181185

182-
writer.writeStringList("internedStrings", newPriorInternedStrings);
183-
return PersistFlags.CREATE;
184-
}
185-
186-
@SuppressWarnings("unused")
187-
public static Object createFromLoader(ImageSingletonLoader loader) {
188-
SetGenerator gen = (() -> Set.of(loader.readStringList("internedStrings").toArray(new String[0])));
189-
190-
return new StringInternSupport(gen);
186+
@Override
187+
public void onSingletonRegistration(ImageSingletonLoader loader, StringInternSupport singleton) {
188+
singleton.priorLayersInternedStrings = (SetGenerator) (() -> Set.of(loader.readStringList("internedStrings").toArray(new String[0])));
189+
}
190+
});
191+
}
191192
}
192193
}
193194

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/util/LayeredHostedImageHeapMapCollector.java

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
package com.oracle.svm.core.util;
2626

2727
import java.util.ArrayList;
28-
import java.util.EnumSet;
2928
import java.util.HashSet;
3029
import java.util.List;
3130
import java.util.Set;
@@ -38,7 +37,13 @@
3837
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
3938
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
4039
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
41-
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
40+
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
41+
import com.oracle.svm.core.traits.SingletonLayeredCallbacks;
42+
import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier;
43+
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
44+
import com.oracle.svm.core.traits.SingletonTrait;
45+
import com.oracle.svm.core.traits.SingletonTraitKind;
46+
import com.oracle.svm.core.traits.SingletonTraits;
4247
import com.oracle.svm.core.util.ImageHeapMap.HostedImageHeapMap;
4348

4449
/**
@@ -50,7 +55,8 @@
5055
* {@code ImageHeapCollectionFeature#allMaps} to ensure it is always rescanned and reachable.
5156
*/
5257
@Platforms(Platform.HOSTED_ONLY.class)
53-
public class LayeredHostedImageHeapMapCollector implements LayeredImageSingleton {
58+
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = LayeredHostedImageHeapMapCollector.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
59+
public class LayeredHostedImageHeapMapCollector {
5460
/**
5561
* Map keys of maps reachable in the current layer.
5662
*/
@@ -92,24 +98,36 @@ public void registerPreviousLayerHostedImageHeapMap(HostedImageHeapMap<?, ?> hos
9298
return previousLayerReachableMaps;
9399
}
94100

95-
@Override
96-
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
97-
return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY;
98-
}
101+
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {
102+
103+
@Override
104+
public SingletonTrait getLayeredCallbacksTrait() {
105+
return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<LayeredHostedImageHeapMapCollector>() {
106+
107+
@Override
108+
public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredHostedImageHeapMapCollector singleton) {
109+
Set<String> reachableMapKeys = new HashSet<>(singleton.currentLayerReachableMapsKeys);
110+
if (singleton.previousLayerReachableMapKeys != null) {
111+
reachableMapKeys.addAll(singleton.previousLayerReachableMapKeys);
112+
}
113+
writer.writeStringList("reachableMapKeys", reachableMapKeys.stream().toList());
114+
return LayeredImageSingleton.PersistFlags.CREATE;
115+
}
99116

100-
@Override
101-
public PersistFlags preparePersist(ImageSingletonWriter writer) {
102-
Set<String> reachableMapKeys = new HashSet<>(currentLayerReachableMapsKeys);
103-
if (previousLayerReachableMapKeys != null) {
104-
reachableMapKeys.addAll(previousLayerReachableMapKeys);
117+
@Override
118+
public Class<? extends LayeredSingletonInstantiator<?>> getSingletonInstantiator() {
119+
return SingletonInstantiator.class;
120+
}
121+
});
105122
}
106-
writer.writeStringList("reachableMapKeys", reachableMapKeys.stream().toList());
107-
return PersistFlags.CREATE;
108123
}
109124

110-
@SuppressWarnings("unused")
111-
public static Object createFromLoader(ImageSingletonLoader loader) {
112-
List<String> previousLayerReachableMapKeys = loader.readStringList("reachableMapKeys");
113-
return new LayeredHostedImageHeapMapCollector(previousLayerReachableMapKeys);
125+
static class SingletonInstantiator implements SingletonLayeredCallbacks.LayeredSingletonInstantiator<LayeredHostedImageHeapMapCollector> {
126+
127+
@Override
128+
public LayeredHostedImageHeapMapCollector createFromLoader(ImageSingletonLoader loader) {
129+
List<String> previousLayerReachableMapKeys = loader.readStringList("reachableMapKeys");
130+
return new LayeredHostedImageHeapMapCollector(previousLayerReachableMapKeys);
131+
}
114132
}
115133
}

0 commit comments

Comments
 (0)