Skip to content

Commit d009d4f

Browse files
committed
Ensure building with minimal observable modules works
1 parent 2a796c7 commit d009d4f

File tree

5 files changed

+69
-17
lines changed

5 files changed

+69
-17
lines changed

substratevm/mx.substratevm/suite.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@
243243
"java.compiler",
244244
"jdk.jfr",
245245
"jdk.management",
246-
"jdk.management.jfr",
246+
"jdk.zipfs",
247247
],
248248
"requiresConcealed" : {
249249
"java.base" : [
@@ -1324,7 +1324,6 @@
13241324
"requires": [
13251325
"java.management",
13261326
"jdk.management",
1327-
"jdk.management.jfr",
13281327
],
13291328
"uses" : [
13301329
"org.graalvm.nativeimage.Platform",

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
package com.oracle.svm.core.jdk;
2828

29+
import java.util.function.BooleanSupplier;
30+
2931
import com.oracle.svm.core.annotate.Alias;
3032
import com.oracle.svm.core.annotate.RecomputeFieldValue;
3133
import com.oracle.svm.core.annotate.Substitute;
@@ -37,8 +39,8 @@
3739
* which is not needed as it only implements the native maxObjectInspectionAge() method, which in
3840
* turn is {@link Target_sun_rmi_transport_GC#maxObjectInspectionAge substituted in here}.
3941
*/
40-
@TargetClass(className = "sun.rmi.transport.GC")
41-
final class Target_sun_rmi_transport_GC {
42+
@TargetClass(className = "sun.rmi.transport.GC", onlyWith = JavaRMIModuleAvailable.class)
43+
public final class Target_sun_rmi_transport_GC {
4244
@Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset)//
4345
private static Thread daemon = null;
4446

@@ -47,3 +49,21 @@ public static long maxObjectInspectionAge() {
4749
return Heap.getHeap().getMillisSinceLastWholeHeapExamined();
4850
}
4951
}
52+
53+
class JavaRMIModuleAvailable implements BooleanSupplier {
54+
55+
private static final boolean hasModule;
56+
57+
static {
58+
var module = ModuleLayer.boot().findModule("java.rmi");
59+
if (module.isPresent()) {
60+
JavaRMIModuleAvailable.class.getModule().addReads(module.get());
61+
}
62+
hasModule = module.isPresent();
63+
}
64+
65+
@Override
66+
public boolean getAsBoolean() {
67+
return hasModule;
68+
}
69+
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/management/ManagementSupport.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.List;
3535
import java.util.Map;
3636
import java.util.Set;
37+
import java.util.function.BooleanSupplier;
3738
import java.util.function.Supplier;
3839

3940
import javax.management.DynamicMBean;
@@ -62,8 +63,6 @@
6263
import com.oracle.svm.core.util.VMError;
6364
import com.sun.jmx.mbeanserver.MXBeanLookup;
6465

65-
import jdk.management.jfr.FlightRecorderMXBean;
66-
6766
/**
6867
* This class provides the SVM support implementation for the MXBean that provide VM introspection,
6968
* which is accessible in the JDK via {@link ManagementFactory}. There are two mostly independent
@@ -105,6 +104,23 @@
105104
*/
106105
public final class ManagementSupport implements ThreadListener {
107106

107+
private static final boolean isJdkManagementJfrModulePresent;
108+
109+
static {
110+
var loggingModule = ModuleLayer.boot().findModule("jdk.management.jfr");
111+
if (loggingModule.isPresent()) {
112+
ManagementSupport.class.getModule().addReads(loggingModule.get());
113+
}
114+
isJdkManagementJfrModulePresent = loggingModule.isPresent();
115+
}
116+
117+
static class JdkManagementJfrModulePresent implements BooleanSupplier {
118+
@Override
119+
public boolean getAsBoolean() {
120+
return isJdkManagementJfrModulePresent;
121+
}
122+
}
123+
108124
/**
109125
* All {@link PlatformManagedObject} structured by their interface. The same object can be
110126
* contained multiple times under different keys. The value is either the
@@ -123,7 +139,7 @@ public final class ManagementSupport implements ThreadListener {
123139

124140
/* Initialized lazily at run time. */
125141
private OperatingSystemMXBean osMXBean;
126-
private FlightRecorderMXBean flightRecorderMXBean;
142+
private PlatformManagedObject flightRecorderMXBean;
127143

128144
/** The singleton MBean server for the platform, initialized lazily at run time. */
129145
MBeanServer platformMBeanServer;
@@ -150,7 +166,7 @@ public final class ManagementSupport implements ThreadListener {
150166
* run time.
151167
*/
152168
doAddPlatformManagedObjectSingleton(getOsMXBeanInterface(), (PlatformManagedObjectSupplier) this::getOsMXBean);
153-
doAddPlatformManagedObjectSingleton(FlightRecorderMXBean.class, (PlatformManagedObjectSupplier) this::getFlightRecorderMXBean);
169+
doAddPlatformManagedObjectSingleton(PlatformManagedObject.class, (PlatformManagedObjectSupplier) this::getFlightRecorderMXBean);
154170
}
155171

156172
private static Class<?> getOsMXBeanInterface() {
@@ -172,7 +188,7 @@ private synchronized OperatingSystemMXBean getOsMXBean() {
172188
return osMXBean;
173189
}
174190

175-
private synchronized FlightRecorderMXBean getFlightRecorderMXBean() {
191+
private synchronized PlatformManagedObject getFlightRecorderMXBean() {
176192
/**
177193
* Requires JFR support and that JMX is user-enabled because
178194
* {@code jdk.management.jfr.FlightRecorderMXBeanImpl} makes
@@ -182,7 +198,7 @@ private synchronized FlightRecorderMXBean getFlightRecorderMXBean() {
182198
return null;
183199
}
184200
if (flightRecorderMXBean == null) {
185-
flightRecorderMXBean = SubstrateUtil.cast(new Target_jdk_management_jfr_FlightRecorderMXBeanImpl(), FlightRecorderMXBean.class);
201+
flightRecorderMXBean = SubstrateUtil.cast(new Target_jdk_management_jfr_FlightRecorderMXBeanImpl(), PlatformManagedObject.class);
186202
}
187203
return flightRecorderMXBean;
188204
}
@@ -384,7 +400,7 @@ private static PlatformManagedObject handleLazyPlatformManagedObjectSingleton(Ob
384400
}
385401

386402
// This is required because FlightRecorderMXBeanImpl is only accessible within its package.
387-
@TargetClass(className = "jdk.management.jfr.FlightRecorderMXBeanImpl")
403+
@TargetClass(className = "jdk.management.jfr.FlightRecorderMXBeanImpl", onlyWith = ManagementSupport.JdkManagementJfrModulePresent.class)
388404
final class Target_jdk_management_jfr_FlightRecorderMXBeanImpl {
389405
@Alias
390406
Target_jdk_management_jfr_FlightRecorderMXBeanImpl() {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ private static void checkBootModuleDependencies(boolean verbose) {
195195
"jdk.management",
196196
"java.compiler",
197197
"jdk.jfr",
198+
"jdk.zipfs",
198199
"jdk.management.jfr");
199200

200201
Set<String> unexpectedBuilderDependencies = modulesBuilderDependsOn.stream().map(Module::getName).collect(Collectors.toSet());

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNio.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.net.InetAddress;
2828
import java.net.SocketAddress;
2929
import java.nio.ByteBuffer;
30-
import java.util.Optional;
3130
import java.util.function.Consumer;
3231

3332
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
@@ -47,8 +46,22 @@
4746
@AutomaticallyRegisteredFeature
4847
public class JNIRegistrationJavaNio extends JNIRegistrationUtil implements InternalFeature {
4948

50-
private static Optional<Module> jdkSctpModule() {
51-
return ModuleLayer.boot().findModule("jdk.sctp");
49+
private static final boolean isJdkSctpModulePresent;
50+
private static final boolean isJavaNamingModulePresent;
51+
52+
static {
53+
Module thisModule = JNIRegistrationJavaNio.class.getModule();
54+
var sctpModule = ModuleLayer.boot().findModule("jdk.sctp");
55+
if (sctpModule.isPresent()) {
56+
thisModule.addReads(sctpModule.get());
57+
}
58+
isJdkSctpModulePresent = sctpModule.isPresent();
59+
60+
var namingModule = ModuleLayer.boot().findModule("java.naming");
61+
if (namingModule.isPresent()) {
62+
thisModule.addReads(namingModule.get());
63+
}
64+
isJavaNamingModulePresent = namingModule.isPresent();
5265
}
5366

5467
@Override
@@ -64,7 +77,7 @@ public void duringSetup(DuringSetupAccess a) {
6477
rerunClassInit(a, "sun.nio.ch.SimpleAsynchronousFileChannelImpl", "sun.nio.ch.SimpleAsynchronousFileChannelImpl$DefaultExecutorHolder",
6578
"sun.nio.ch.SinkChannelImpl", "sun.nio.ch.SourceChannelImpl");
6679
rerunClassInit(a, "sun.nio.fs.UnixNativeDispatcher", "sun.nio.ch.UnixAsynchronousServerSocketChannelImpl");
67-
if (isLinux() && jdkSctpModule().isPresent()) {
80+
if (isLinux() && isJdkSctpModulePresent) {
6881
rerunClassInit(a, "sun.nio.ch.sctp.SctpChannelImpl");
6982
}
7083
} else if (isWindows()) {
@@ -93,7 +106,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) {
93106

94107
if (isPosix()) {
95108
a.registerReachabilityHandler(JNIRegistrationJavaNio::registerUnixNativeDispatcherInit, method(a, "sun.nio.fs.UnixNativeDispatcher", "init"));
96-
if (isLinux() && jdkSctpModule().isPresent()) {
109+
if (isLinux() && isJdkSctpModulePresent) {
97110
a.registerReachabilityHandler(JNIRegistrationJavaNio::registerSctpChannelImplInitIDs, method(a, "sun.nio.ch.sctp.SctpChannelImpl", "initIDs"));
98111
}
99112

@@ -102,7 +115,10 @@ public void beforeAnalysis(BeforeAnalysisAccess a) {
102115
a.registerReachabilityHandler(JNIRegistrationJavaNio::registerIocpInitIDs, method(a, "sun.nio.ch.Iocp", "initIDs"));
103116
}
104117

105-
a.registerReachabilityHandler(JNIRegistrationJavaNio::registerConnectionCreateInetSocketAddress, method(a, "com.sun.jndi.ldap.Connection", "createInetSocketAddress", String.class, int.class));
118+
if (isJavaNamingModulePresent) {
119+
a.registerReachabilityHandler(JNIRegistrationJavaNio::registerConnectionCreateInetSocketAddress,
120+
method(a, "com.sun.jndi.ldap.Connection", "createInetSocketAddress", String.class, int.class));
121+
}
106122

107123
Consumer<DuringAnalysisAccess> registerInitInetAddressIDs = JNIRegistrationJavaNet::registerInitInetAddressIDs;
108124
a.registerReachabilityHandler(registerInitInetAddressIDs, method(a, "sun.nio.ch.Net", "initIDs"));

0 commit comments

Comments
 (0)