Skip to content

Commit 3ef18bb

Browse files
committed
[GR-71642] Use EconomicMap in LayeredModuleSingleton.
PullRequest: graal/22728
2 parents e915429 + 5933b70 commit 3ef18bb

File tree

3 files changed

+31
-19
lines changed

3 files changed

+31
-19
lines changed

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@
2424
*/
2525
package com.oracle.svm.core.jdk;
2626

27-
import java.util.Collection;
2827
import java.util.HashMap;
2928
import java.util.HashSet;
3029
import java.util.Map;
3130
import java.util.Set;
3231

32+
import org.graalvm.collections.EconomicMap;
3333
import org.graalvm.nativeimage.ImageSingletons;
3434
import org.graalvm.nativeimage.Platform;
3535
import org.graalvm.nativeimage.Platforms;
@@ -48,19 +48,19 @@ public abstract class LayeredModuleSingleton {
4848
public static final String ALL_UNNAMED_MODULE_NAME = "native-image-all-unnamed";
4949
public static final String EVERYONE_MODULE_NAME = "native-image-everyone";
5050

51-
protected final Map<String, Map<String, Set<String>>> moduleOpenPackages;
52-
protected final Map<String, Map<String, Set<String>>> moduleExportedPackages;
51+
protected final EconomicMap<String, Map<String, Set<String>>> moduleOpenPackages;
52+
protected final EconomicMap<String, Map<String, Set<String>>> moduleExportedPackages;
5353

54-
private final Map<String, ResolvedJavaModule> nameToModule = new HashMap<>();
54+
private final EconomicMap<String, ResolvedJavaModule> nameToModule = EconomicMap.create();
5555

5656
private ResolvedJavaModule everyoneModule;
5757
private ResolvedJavaModule allUnnamedModule;
5858

5959
public LayeredModuleSingleton() {
60-
this(new HashMap<>(), new HashMap<>());
60+
this(EconomicMap.create(), EconomicMap.create());
6161
}
6262

63-
public LayeredModuleSingleton(Map<String, Map<String, Set<String>>> moduleOpenPackages, Map<String, Map<String, Set<String>>> moduleExportedPackages) {
63+
public LayeredModuleSingleton(EconomicMap<String, Map<String, Set<String>>> moduleOpenPackages, EconomicMap<String, Map<String, Set<String>>> moduleExportedPackages) {
6464
this.moduleOpenPackages = moduleOpenPackages;
6565
this.moduleExportedPackages = moduleExportedPackages;
6666
}
@@ -82,8 +82,17 @@ public Map<String, Set<String>> getExportedPackages(ResolvedJavaModule module) {
8282
return moduleExportedPackages.get(module.getName());
8383
}
8484

85-
public Collection<ResolvedJavaModule> getModules() {
86-
return nameToModule.values();
85+
public Iterable<ResolvedJavaModule> getModules() {
86+
return nameToModule.getValues();
87+
}
88+
89+
public boolean containsModule(ResolvedJavaModule module) {
90+
for (ResolvedJavaModule m : nameToModule.getValues()) {
91+
if (m.equals(module)) {
92+
return true;
93+
}
94+
}
95+
return false;
8796
}
8897

8998
public void setOpenPackages(ResolvedJavaModule module, Map<String, Set<Module>> openPackages) {
@@ -94,7 +103,7 @@ public void setExportedPackages(ResolvedJavaModule module, Map<String, Set<Modul
94103
setPackages(module, moduleExportedPackages, exportedPackages, "exported");
95104
}
96105

97-
private void setPackages(ResolvedJavaModule module, Map<String, Map<String, Set<String>>> modulePackages, Map<String, Set<Module>> packages, String mode) {
106+
private void setPackages(ResolvedJavaModule module, EconomicMap<String, Map<String, Set<String>>> modulePackages, Map<String, Set<Module>> packages, String mode) {
98107
ResolvedJavaModule oldValue = nameToModule.put(module.toString(), module);
99108
if (oldValue != null && !oldValue.equals(module)) {
100109
throw UserError.abort("Layered images require all modules to have a different name because their identity hash code is not consistent across layers. " +

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.oracle.svm.hosted.imagelayer.SVMImageLayerWriter;
4848
import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.ModulePackages;
4949
import com.oracle.svm.shaded.org.capnproto.StructList;
50+
import org.graalvm.collections.EconomicMap;
5051

5152
@AutomaticallyRegisteredImageSingleton(value = LayeredModuleSingleton.class, onlyWith = BuildingInitialLayerPredicate.class)
5253
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = HostedLayeredModuleSingleton.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
@@ -55,17 +56,18 @@ public HostedLayeredModuleSingleton() {
5556
super();
5657
}
5758

58-
public HostedLayeredModuleSingleton(Map<String, Map<String, Set<String>>> moduleOpenPackages, Map<String, Map<String, Set<String>>> moduleExportedPackages) {
59+
public HostedLayeredModuleSingleton(EconomicMap<String, Map<String, Set<String>>> moduleOpenPackages, EconomicMap<String, Map<String, Set<String>>> moduleExportedPackages) {
5960
super(moduleOpenPackages, moduleExportedPackages);
6061
}
6162

6263
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {
63-
private static void persistModulePackages(StructList.Builder<ModulePackages.Builder> modulePackagesBuilder, Map<String, Map<String, Set<String>>> modulePackages) {
64+
private static void persistModulePackages(StructList.Builder<ModulePackages.Builder> modulePackagesBuilder, EconomicMap<String, Map<String, Set<String>>> modulePackages) {
6465
int i = 0;
65-
for (var entry : modulePackages.entrySet()) {
66+
var it = modulePackages.getEntries();
67+
while (it.advance()) {
6668
var entryBuilder = modulePackagesBuilder.get(i);
67-
entryBuilder.setModuleKey(entry.getKey());
68-
Map<String, Set<String>> value = entry.getValue();
69+
entryBuilder.setModuleKey(it.getKey());
70+
Map<String, Set<String>> value = it.getValue();
6971
var packagesBuilder = entryBuilder.initPackages(value.size());
7072
int j = 0;
7173
for (var packageEntry : value.entrySet()) {
@@ -100,8 +102,8 @@ public Class<? extends LayeredSingletonInstantiator<?>> getSingletonInstantiator
100102
}
101103

102104
static class SingletonInstantiator implements SingletonLayeredCallbacks.LayeredSingletonInstantiator<HostedLayeredModuleSingleton> {
103-
private static Map<String, Map<String, Set<String>>> getModulePackages(StructList.Reader<ModulePackages.Reader> modulePackagesReader) {
104-
Map<String, Map<String, Set<String>>> modulePackages = new HashMap<>();
105+
private static EconomicMap<String, Map<String, Set<String>>> getModulePackages(StructList.Reader<ModulePackages.Reader> modulePackagesReader) {
106+
EconomicMap<String, Map<String, Set<String>>> modulePackages = EconomicMap.create();
105107
for (int i = 0; i < modulePackagesReader.size(); ++i) {
106108
var entryReader = modulePackagesReader.get(i);
107109
var packagesReader = entryReader.getPackages();
@@ -121,8 +123,8 @@ public HostedLayeredModuleSingleton createFromLoader(ImageSingletonLoader loader
121123
SVMImageLayerSingletonLoader.ImageSingletonLoaderImpl loaderImpl = (SVMImageLayerSingletonLoader.ImageSingletonLoaderImpl) loader;
122124
var reader = loaderImpl.getSnapshotReader().getLayeredModule();
123125

124-
Map<String, Map<String, Set<String>>> moduleOpenPackages = getModulePackages(reader.getOpenModulePackages());
125-
Map<String, Map<String, Set<String>>> moduleExportedPackages = getModulePackages(reader.getExportedModulePackages());
126+
EconomicMap<String, Map<String, Set<String>>> moduleOpenPackages = getModulePackages(reader.getOpenModulePackages());
127+
EconomicMap<String, Map<String, Set<String>>> moduleExportedPackages = getModulePackages(reader.getExportedModulePackages());
126128

127129
return new HostedLayeredModuleSingleton(moduleOpenPackages, moduleExportedPackages);
128130
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ static class LayerPackagesTransformer implements FieldValueTransformer {
219219
@Override
220220
public Object transform(Object receiver, Object originalValue) {
221221
Module module = (Module) receiver;
222-
if (!LayeredModuleSingleton.singleton().getModules().contains(GraalAccess.lookupModule(module))) {
222+
223+
if (!LayeredModuleSingleton.singleton().containsModule(GraalAccess.lookupModule(module))) {
223224
/*
224225
* Modules that are not processed by the LayeredModuleSingleton don't need to be
225226
* delayed until the application layer.

0 commit comments

Comments
 (0)