Skip to content

Commit 8306a52

Browse files
committed
[GR-65849] Avoid tracing during VM operations.
PullRequest: graal/21085
2 parents d9ec60a + 0e2b268 commit 8306a52

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/metadata/MetadataTracer.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import com.oracle.svm.core.option.HostedOptionKey;
5454
import com.oracle.svm.core.option.RuntimeOptionKey;
5555
import com.oracle.svm.core.option.SubstrateOptionsParser;
56+
import com.oracle.svm.core.thread.VMOperation;
5657
import com.oracle.svm.core.util.VMError;
5758

5859
import jdk.graal.compiler.api.replacements.Fold;
@@ -89,6 +90,11 @@ public static class Options {
8990
}
9091

9192
private RecordOptions options;
93+
94+
/**
95+
* The configuration set to trace with. Do not read this field directly when tracing; instead
96+
* use {@link #getConfigurationSetForTracing()} to acquire it.
97+
*/
9298
private volatile ConfigurationSet config;
9399

94100
@Fold
@@ -104,6 +110,18 @@ public boolean enabled() {
104110
return options != null;
105111
}
106112

113+
/**
114+
* Returns the configuration set to trace with. Returns {@code null} if tracing should not be
115+
* performed for some reason.
116+
*/
117+
private ConfigurationSet getConfigurationSetForTracing() {
118+
if (VMOperation.isInProgress()) {
119+
// Do not trace during VM operations.
120+
return null;
121+
}
122+
return config;
123+
}
124+
107125
/**
108126
* Marks the given type as reachable from reflection.
109127
*
@@ -123,7 +141,7 @@ public void traceProxyType(List<String> interfaceNames) {
123141

124142
private ConfigurationType traceReflectionTypeImpl(ConfigurationTypeDescriptor typeDescriptor) {
125143
assert enabled();
126-
ConfigurationSet configurationSet = config;
144+
ConfigurationSet configurationSet = getConfigurationSetForTracing();
127145
if (configurationSet != null) {
128146
return configurationSet.getReflectionConfiguration().getOrCreateType(UnresolvedConfigurationCondition.alwaysTrue(), typeDescriptor);
129147
}
@@ -150,7 +168,7 @@ public ConfigurationType traceJNIType(String className) {
150168
*/
151169
public void traceResource(String resourceName, String moduleName) {
152170
assert enabled();
153-
ConfigurationSet configurationSet = config;
171+
ConfigurationSet configurationSet = getConfigurationSetForTracing();
154172
if (configurationSet != null) {
155173
configurationSet.getResourceConfiguration().addGlobPattern(UnresolvedConfigurationCondition.alwaysTrue(), resourceName, moduleName);
156174
}
@@ -161,7 +179,7 @@ public void traceResource(String resourceName, String moduleName) {
161179
*/
162180
public void traceResourceBundle(String baseName) {
163181
assert enabled();
164-
ConfigurationSet configurationSet = config;
182+
ConfigurationSet configurationSet = getConfigurationSetForTracing();
165183
if (configurationSet != null) {
166184
configurationSet.getResourceConfiguration().addBundle(UnresolvedConfigurationCondition.alwaysTrue(), baseName, List.of());
167185
}

0 commit comments

Comments
 (0)