Skip to content

Commit e757db4

Browse files
committed
Make class initialization sealing/unsealing mechanism thread safe.
1 parent ce056cb commit e757db4

File tree

3 files changed

+43
-22
lines changed

3 files changed

+43
-22
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ protected boolean runPointsToAnalysis(String imageName, OptionValues options, De
815815
ServiceCatalogSupport.singleton().enableServiceCatalogMapTransformer(config);
816816
featureHandler.forEachFeature(feature -> feature.beforeAnalysis(config));
817817
ServiceCatalogSupport.singleton().seal();
818-
bb.getHostVM().getClassInitializationSupport().setConfigurationSealed(true);
818+
bb.getHostVM().getClassInitializationSupport().sealConfiguration();
819819
if (ImageLayerBuildingSupport.buildingImageLayer()) {
820820
ImageSingletons.lookup(LoadImageSingletonFeature.class).processRegisteredSingletons(aUniverse);
821821
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/classinitialization/ClassInitializationSupport.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,29 @@ public ClassInitializationSupport(MetaAccessProvider metaAccess, ImageClassLoade
125125
this.loader = loader;
126126
}
127127

128-
public void setConfigurationSealed(boolean sealed) {
128+
/**
129+
* Seal the configuration, blocking if another thread is trying to seal the configuration or an
130+
* unsealed-configuration window is currently open in another thread.
131+
*/
132+
public synchronized void sealConfiguration() {
133+
setConfigurationSealed(true);
134+
}
135+
136+
/**
137+
* Run the action in an unsealed-configuration window, blocking if another thread is trying to
138+
* seal the configuration or an unsealed-configuration window is currently open in another
139+
* thread. The window is reentrant, i.e., it will not block the thread that opened the window
140+
* from trying to reenter the window. Note that if the configuration was not sealed when the
141+
* window was opened this will not affect the seal status.
142+
*/
143+
public synchronized void withUnsealedConfiguration(Runnable action) {
144+
var previouslySealed = configurationSealed;
145+
setConfigurationSealed(false);
146+
action.run();
147+
setConfigurationSealed(previouslySealed);
148+
}
149+
150+
private void setConfigurationSealed(boolean sealed) {
129151
configurationSealed = sealed;
130152
if (configurationSealed && ClassInitializationOptions.PrintClassInitialization.getValue()) {
131153
List<ClassOrPackageConfig> allConfigs = classInitializationConfiguration.allConfigs();

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -123,31 +123,30 @@ List<String> xmlParserClasses() {
123123
static class TransformerClassesAndResources extends XMLParsersRegistration {
124124

125125
@Override
126+
@SuppressWarnings("try")
126127
void registerResources() {
127128
/*
128129
* To allow register new resource bundle classes during analysis phase
129130
*/
130131
ClassInitializationSupport classInitializationSupport = (ClassInitializationSupport) ImageSingletons.lookup(RuntimeClassInitializationSupport.class);
131-
classInitializationSupport.setConfigurationSealed(false);
132-
133-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages");
134-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages");
135-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.Encodings");
136-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.HTMLEntities");
137-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.XMLEntities");
138-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.xpath.regex.message");
139-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.DOMMessages");
140-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.DatatypeMessages");
141-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages");
142-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.SAXMessages");
143-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages");
144-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
145-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages");
146-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages");
147-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages");
148-
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xalan.internal.res.XSLTInfo");
149-
150-
classInitializationSupport.setConfigurationSealed(true);
132+
classInitializationSupport.withUnsealedConfiguration(() -> {
133+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages");
134+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages");
135+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.Encodings");
136+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.HTMLEntities");
137+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.XMLEntities");
138+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.xpath.regex.message");
139+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.DOMMessages");
140+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.DatatypeMessages");
141+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages");
142+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.SAXMessages");
143+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages");
144+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
145+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages");
146+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages");
147+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages");
148+
ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xalan.internal.res.XSLTInfo");
149+
});
151150
}
152151

153152
@Override

0 commit comments

Comments
 (0)