--- old/src/jdk.net/linux/classes/jdk/internal/net/rdma/LinuxRdmaPollSelectorProvider.java 2018-11-28 16:36:30.224693162 +0000 +++ new/src/jdk.net/linux/classes/jdk/internal/net/rdma/LinuxRdmaPollSelectorProvider.java 2018-11-28 16:36:29.848693175 +0000 @@ -36,37 +36,16 @@ { public AbstractSelector openSelector(RdmaPollSelectorProvider sp) throws IOException { - AbstractSelector selector; - try { - selector = new RdmaPollSelectorImpl(sp); - } catch (ExceptionInInitializerError e) { - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - } - return selector; + return new RdmaPollSelectorImpl(sp); } public SocketChannel openSocketChannel(RdmaPollSelectorProvider sp) throws IOException { - SocketChannel sc; - try { - sc = new RdmaSocketChannelImpl(sp); - } catch (ExceptionInInitializerError e) { - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - } - return sc; + return new RdmaSocketChannelImpl(sp); } public ServerSocketChannel openServerSocketChannel(RdmaPollSelectorProvider sp) throws IOException { - ServerSocketChannel ssc; - try { - ssc = new RdmaServerSocketChannelImpl(sp); - } catch (ExceptionInInitializerError e) { - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - } - return ssc; + return new RdmaServerSocketChannelImpl(sp); } } --- old/src/jdk.net/linux/classes/jdk/internal/net/rdma/LinuxRdmaSocketImpl.java 2018-11-28 16:36:30.900693139 +0000 +++ new/src/jdk.net/linux/classes/jdk/internal/net/rdma/LinuxRdmaSocketImpl.java 2018-11-28 16:36:30.528693152 +0000 @@ -34,6 +34,15 @@ class LinuxRdmaSocketImpl extends PlatformRdmaSocketImpl { + private static final UnsupportedOperationException unsupported; + + private static final Void checkSupported() { + if (unsupported != null) + throw new UnsupportedOperationException(unsupported.getMessage(), unsupported); + else + return null; + } + static { java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<>() { @@ -43,10 +52,20 @@ return null; } }); - initProto(); + UnsupportedOperationException uoe = null; + try { + initProto(); + } catch (UnsupportedOperationException e) { + uoe = e; + } + unsupported = uoe; + } + + public LinuxRdmaSocketImpl() { + this(checkSupported()); } - public LinuxRdmaSocketImpl() { } + private LinuxRdmaSocketImpl(Void unused) { } static final RdmaSocketOptions rdmaOptions = RdmaSocketOptions.getInstance(); @@ -80,7 +99,7 @@ } } - static native void initProto(); + static native void initProto() throws UnsupportedOperationException; private static native boolean isRdmaAvailable0(); --- old/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaPollSelectorImpl.java 2018-11-28 16:36:31.588693115 +0000 +++ new/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaPollSelectorImpl.java 2018-11-28 16:36:31.200693129 +0000 @@ -35,8 +35,17 @@ public class RdmaPollSelectorImpl extends PollSelectorImpl { + private static final UnsupportedOperationException unsupported; + + private static final SelectorProvider checkSupported(SelectorProvider sp) { + if (unsupported != null) + throw new UnsupportedOperationException(unsupported.getMessage(), unsupported); + else + return sp; + } + protected RdmaPollSelectorImpl(SelectorProvider sp) throws IOException { - super(sp); + super(checkSupported(sp)); } protected int poll(long pollAddress, int numfds, int timeout) { @@ -54,8 +63,14 @@ } }); IOUtil.load(); - init(); + UnsupportedOperationException uoe = null; + try { + init(); + } catch (UnsupportedOperationException e) { + uoe = e; + } + unsupported = uoe; } - private static native void init(); + private static native void init() throws UnsupportedOperationException; } --- old/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaServerSocketChannelImpl.java 2018-11-28 16:36:32.272693091 +0000 +++ new/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaServerSocketChannelImpl.java 2018-11-28 16:36:31.896693104 +0000 @@ -80,8 +80,17 @@ private ServerSocket socket; + private static final UnsupportedOperationException unsupported; + + private static final SelectorProvider checkSupported(SelectorProvider sp) { + if (unsupported != null) + throw new UnsupportedOperationException(unsupported.getMessage(), unsupported); + else + return sp; + } + RdmaServerSocketChannelImpl(SelectorProvider sp) throws IOException { - super(sp); + super(checkSupported(sp)); this.fd = RdmaNet.serverSocket(); this.fdVal = IOUtil.fdVal(fd); } @@ -89,7 +98,7 @@ RdmaServerSocketChannelImpl(SelectorProvider sp, FileDescriptor fd, boolean bound) throws IOException { - super(sp); + super(checkSupported(sp)); this.fd = fd; this.fdVal = IOUtil.fdVal(fd); if (bound) { @@ -469,12 +478,18 @@ InetSocketAddress[] isaa) throws IOException; - private static native void initIDs(); + private static native void initIDs()throws UnsupportedOperationException; static { IOUtil.load(); System.loadLibrary("extnet"); - initIDs(); + UnsupportedOperationException uoe = null; + try { + initIDs(); + } catch (UnsupportedOperationException e) { + uoe = e; + } + unsupported = uoe; nd = new RdmaSocketDispatcher(); } } --- old/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaSocketChannelImpl.java 2018-11-28 16:36:32.976693067 +0000 +++ new/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaSocketChannelImpl.java 2018-11-28 16:36:32.588693080 +0000 @@ -91,8 +91,17 @@ private Socket socket; + private static final UnsupportedOperationException unsupported; + + private static final SelectorProvider checkSupported(SelectorProvider sp) { + if (unsupported != null) + throw new UnsupportedOperationException(unsupported.getMessage(), unsupported); + else + return sp; + } + protected RdmaSocketChannelImpl(SelectorProvider sp) throws IOException { - super(sp); + super(checkSupported(sp)); this.fd = RdmaNet.socket(); this.fdVal = IOUtil.fdVal(fd); } @@ -100,7 +109,7 @@ protected RdmaSocketChannelImpl(SelectorProvider sp, FileDescriptor fd, boolean bound) throws IOException { - super(sp); + super(checkSupported(sp)); this.fd = fd; this.fdVal = IOUtil.fdVal(fd); if (bound) { @@ -113,7 +122,7 @@ RdmaSocketChannelImpl(SelectorProvider sp, FileDescriptor fd, InetSocketAddress isa) throws IOException { - super(sp); + super(checkSupported(sp)); this.fd = fd; this.fdVal = IOUtil.fdVal(fd); synchronized (stateLock) { @@ -946,7 +955,7 @@ // -- Native methods -- - private static native void initIDs(); + private static native void initIDs() throws UnsupportedOperationException; private static native int checkConnect(FileDescriptor fd, boolean block) throws IOException; @@ -956,8 +965,14 @@ static { IOUtil.load(); - System.loadLibrary("extnet"); - initIDs(); + System.loadLibrary("extnet"); + UnsupportedOperationException uoe = null; + try { + initIDs(); + } catch (UnsupportedOperationException e) { + uoe = e; + } + unsupported = uoe; nd = new RdmaSocketDispatcher(); } --- old/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaSocketImpl.java 2018-11-28 16:36:33.672693043 +0000 +++ new/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaSocketImpl.java 2018-11-28 16:36:33.304693056 +0000 @@ -47,7 +47,7 @@ import sun.net.ConnectionResetException; import sun.net.ext.RdmaSocketOptions; -public class RdmaSocketImpl extends SocketImpl +public abstract class RdmaSocketImpl extends SocketImpl { Socket socket = null; ServerSocket serverSocket = null; @@ -88,6 +88,21 @@ return platformRdmaSocketImpl.isRdmaAvailable(); } + private static final Void checkSupported() { + if (PlatformRdmaSocketImpl.unsupported != null) { + Exception e = PlatformRdmaSocketImpl.unsupported; + throw new UnsupportedOperationException(e.getMessage(), e); + } else { + return null; + } + } + + public RdmaSocketImpl() { + this(checkSupported()); + } + + private RdmaSocketImpl(Void unused) { } + void setSocket(Socket soc) { this.socket = soc; } @@ -105,7 +120,7 @@ } @Override - protected Set> supportedOptions() { return null; } + protected abstract Set> supportedOptions(); protected synchronized void create(boolean stream) throws IOException { fd = new FileDescriptor(); @@ -179,13 +194,13 @@ } @Override - protected void setOption(SocketOption name, T value) - throws IOException {} + protected abstract void setOption(SocketOption name, T value) + throws IOException; @SuppressWarnings("unchecked") @Override - protected T getOption(SocketOption name) - throws IOException { return null; } + protected abstract T getOption(SocketOption name) + throws IOException; public void setOption(int opt, Object val) throws SocketException { if (isClosedOrPending()) { @@ -536,6 +551,7 @@ public static final int SHUT_WR = 1; static class PlatformRdmaSocketImpl { + private static UnsupportedOperationException unsupported; @SuppressWarnings("unchecked") private static PlatformRdmaSocketImpl newInstance(String cn) { @@ -544,6 +560,8 @@ c = (Class)Class.forName(cn); return c.getConstructor(new Class[] {}).newInstance(); } catch (ReflectiveOperationException x) { + if (x.getCause() instanceof UnsupportedOperationException) + throw (UnsupportedOperationException)x.getCause(); throw new AssertionError(x); } } @@ -555,9 +573,20 @@ return System.getProperty("os.name"); } }); - if ("Linux".equals(osname)) - return newInstance("jdk.internal.net.rdma.LinuxRdmaSocketImpl"); - return new PlatformRdmaSocketImpl(); + PlatformRdmaSocketImpl impl; + UnsupportedOperationException uoe = null; + if ("Linux".equals(osname)) { + try { + impl = newInstance("jdk.internal.net.rdma.LinuxRdmaSocketImpl"); + } catch (UnsupportedOperationException e) { + uoe = e; + impl = new PlatformRdmaSocketImpl(); + } + } else { + impl = new PlatformRdmaSocketImpl(); + } + unsupported = uoe; + return impl; } private static final PlatformRdmaSocketImpl instance = create(); --- old/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaSocketProvider.java 2018-11-28 16:36:34.376693019 +0000 +++ new/src/jdk.net/linux/classes/jdk/internal/net/rdma/RdmaSocketProvider.java 2018-11-28 16:36:33.996693032 +0000 @@ -29,6 +29,7 @@ import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; +import java.net.SocketImpl; import java.net.SocketOption; import java.net.SocketOptions; import java.net.StandardSocketOptions; @@ -38,216 +39,132 @@ import jdk.net.RdmaSocketOptions; public class RdmaSocketProvider { - private static boolean rdmaLibInstalled = false; - private static boolean rdmaLibChecked = false; static class RdmaClientSocketImpl extends RdmaSocketImpl { - + + private final Set> options = + Set.of(StandardSocketOptions.SO_SNDBUF, + StandardSocketOptions.SO_RCVBUF, + StandardSocketOptions.SO_REUSEADDR, + StandardSocketOptions.TCP_NODELAY, + RdmaSocketOptions.RDMA_SQSIZE, + RdmaSocketOptions.RDMA_RQSIZE, + RdmaSocketOptions.RDMA_INLINE); + + @Override + public Set> supportedOptions() { + return options; + } + @Override protected void setOption(SocketOption name, T value) - throws IOException { - if(rdmaLibChecked && !rdmaLibInstalled) - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - - rdmaLibChecked = true; - try { - if (!rdmaOptions.isOptionSupported(name)) { - int opt; - if (name == StandardSocketOptions.SO_SNDBUF) { - opt = SocketOptions.SO_SNDBUF; - } else if (name == StandardSocketOptions.SO_RCVBUF) { - opt = SocketOptions.SO_RCVBUF; - } else if (name == StandardSocketOptions.SO_REUSEADDR) { - opt = SocketOptions.SO_REUSEADDR; - } else if (name == StandardSocketOptions.TCP_NODELAY) { - opt = SocketOptions.TCP_NODELAY; - } else { - throw new UnsupportedOperationException( - "unsupported option: " + name); - } - setOption(opt, value); + throws IOException { + if (!rdmaOptions.isOptionSupported(name)) { + int opt; + if (name == StandardSocketOptions.SO_SNDBUF) { + opt = SocketOptions.SO_SNDBUF; + } else if (name == StandardSocketOptions.SO_RCVBUF) { + opt = SocketOptions.SO_RCVBUF; + } else if (name == StandardSocketOptions.SO_REUSEADDR) { + opt = SocketOptions.SO_REUSEADDR; + } else if (name == StandardSocketOptions.TCP_NODELAY) { + opt = SocketOptions.TCP_NODELAY; } else { - rdmaOptions.setOption(fd, name, value); + throw new UnsupportedOperationException( + "unsupported option: " + name); } - rdmaLibInstalled = true; - } catch (ExceptionInInitializerError e) { - rdmaLibInstalled = false; - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); + setOption(opt, value); + } else { + rdmaOptions.setOption(fd, name, value); } } @SuppressWarnings("unchecked") @Override protected T getOption(SocketOption name) throws IOException { - if(rdmaLibChecked && !rdmaLibInstalled) - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - - rdmaLibChecked = true; Object value; - try { - if (!rdmaOptions.isOptionSupported(name)) { - int opt; - if (name == StandardSocketOptions.SO_SNDBUF) { - opt = SocketOptions.SO_SNDBUF; - } else if (name == StandardSocketOptions.SO_RCVBUF) { - opt = SocketOptions.SO_RCVBUF; - } else if (name == StandardSocketOptions.SO_REUSEADDR) { - opt = SocketOptions.SO_REUSEADDR; - } else if (name == StandardSocketOptions.TCP_NODELAY) { - opt = SocketOptions.TCP_NODELAY; - } else { - throw new UnsupportedOperationException( - "unsupported option: " + name); - } - value = getOption(opt); + if (!rdmaOptions.isOptionSupported(name)) { + int opt; + if (name == StandardSocketOptions.SO_SNDBUF) { + opt = SocketOptions.SO_SNDBUF; + } else if (name == StandardSocketOptions.SO_RCVBUF) { + opt = SocketOptions.SO_RCVBUF; + } else if (name == StandardSocketOptions.SO_REUSEADDR) { + opt = SocketOptions.SO_REUSEADDR; + } else if (name == StandardSocketOptions.TCP_NODELAY) { + opt = SocketOptions.TCP_NODELAY; } else { - value = rdmaOptions.getOption(fd, name); + throw new UnsupportedOperationException( + "unsupported option: " + name); } - rdmaLibInstalled = true; - return (T) value; - } catch (ExceptionInInitializerError e) { - rdmaLibInstalled = false; - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); + value = getOption(opt); + } else { + value = rdmaOptions.getOption(fd, name); } + return (T) value; } } static class RdmaServerSocketImpl extends RdmaSocketImpl { + private final Set> options = + Set.of(StandardSocketOptions.SO_RCVBUF, + StandardSocketOptions.SO_REUSEADDR, + RdmaSocketOptions.RDMA_SQSIZE, + RdmaSocketOptions.RDMA_RQSIZE, + RdmaSocketOptions.RDMA_INLINE); + + @Override + public Set> supportedOptions() { + return options; + } @Override protected void setOption(SocketOption name, T value) - throws IOException { - if(rdmaLibChecked && !rdmaLibInstalled) - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - - rdmaLibChecked = true; - - try { - if (!rdmaOptions.isOptionSupported(name)) { - int opt; - if (name == StandardSocketOptions.SO_RCVBUF) { - opt = SocketOptions.SO_RCVBUF; - } else if (name == StandardSocketOptions.SO_REUSEADDR) { - opt = SocketOptions.SO_REUSEADDR; - } else { - throw new UnsupportedOperationException( - "unsupported option: " + name); - } - setOption(opt, value); + throws IOException { + if (!rdmaOptions.isOptionSupported(name)) { + int opt; + if (name == StandardSocketOptions.SO_RCVBUF) { + opt = SocketOptions.SO_RCVBUF; + } else if (name == StandardSocketOptions.SO_REUSEADDR) { + opt = SocketOptions.SO_REUSEADDR; } else { - rdmaOptions.setOption(fd, name, value); + throw new UnsupportedOperationException( + "unsupported option: " + name); } - rdmaLibInstalled = true; - } catch (ExceptionInInitializerError e) { - rdmaLibInstalled = false; - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); + setOption(opt, value); + } else { + rdmaOptions.setOption(fd, name, value); } } @SuppressWarnings("unchecked") @Override protected T getOption(SocketOption name) throws IOException { - if(rdmaLibChecked && !rdmaLibInstalled) - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - - rdmaLibChecked = true; Object value; - try { - if (!rdmaOptions.isOptionSupported(name)) { - int opt; - if (name == StandardSocketOptions.SO_RCVBUF) { - opt = SocketOptions.SO_RCVBUF; - } else if (name == StandardSocketOptions.SO_REUSEADDR) { - opt = SocketOptions.SO_REUSEADDR; - } else { - throw new UnsupportedOperationException( - "unsupported option: " + name); - } - rdmaLibInstalled = true; - value = getOption(opt); + if (!rdmaOptions.isOptionSupported(name)) { + int opt; + if (name == StandardSocketOptions.SO_RCVBUF) { + opt = SocketOptions.SO_RCVBUF; + } else if (name == StandardSocketOptions.SO_REUSEADDR) { + opt = SocketOptions.SO_REUSEADDR; } else { - rdmaLibInstalled = true; - value = rdmaOptions.getOption(fd, name); + throw new UnsupportedOperationException( + "unsupported option: " + name); } - rdmaLibInstalled = true; - return (T) value; - } catch (ExceptionInInitializerError e) { - rdmaLibInstalled = false; - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); + value = getOption(opt); + } else { + value = rdmaOptions.getOption(fd, name); } + return (T) value; } } public static Socket openSocket() throws IOException { - if(rdmaLibChecked && !rdmaLibInstalled) - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - - rdmaLibChecked = true; - - RdmaClientSocketImpl impl; - try { - impl = new RdmaClientSocketImpl(); - rdmaLibInstalled = true; - } catch (ExceptionInInitializerError e) { - rdmaLibInstalled = false; - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - } - Socket s = new Socket(impl) { - private final Set> options = - Set.of(StandardSocketOptions.SO_SNDBUF, - StandardSocketOptions.SO_RCVBUF, - StandardSocketOptions.SO_REUSEADDR, - StandardSocketOptions.TCP_NODELAY, - RdmaSocketOptions.RDMA_SQSIZE, - RdmaSocketOptions.RDMA_RQSIZE, - RdmaSocketOptions.RDMA_INLINE); - - @Override - public Set> supportedOptions() { - return options; - } - }; - return s; + return new Socket(new RdmaClientSocketImpl()) { }; } public static ServerSocket openServerSocket() throws IOException { - if(rdmaLibChecked && !rdmaLibInstalled) - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - - rdmaLibChecked = true; - - RdmaServerSocketImpl impl; - try { - impl = new RdmaServerSocketImpl(); - rdmaLibInstalled = true; - } catch (ExceptionInInitializerError e) { - rdmaLibInstalled = false; - throw new UnsupportedOperationException( - "librdmacm library is not installed!"); - } - ServerSocket ss = new ServerSocket(impl) { - private final Set> options = - Set.of(StandardSocketOptions.SO_RCVBUF, - StandardSocketOptions.SO_REUSEADDR, - RdmaSocketOptions.RDMA_SQSIZE, - RdmaSocketOptions.RDMA_RQSIZE, - RdmaSocketOptions.RDMA_INLINE); - - @Override - public Set> supportedOptions() { - return options; - } + return new ServerSocket( new RdmaServerSocketImpl()) { public Socket accept() throws IOException { if (isClosed()) throw new SocketException("Socket is closed"); @@ -257,9 +174,8 @@ Socket s = openSocket(); implAccept(s); return s; - } + } }; - return ss; } private RdmaSocketProvider() {} --- old/src/jdk.net/linux/classes/jdk/net/LinuxRdmaSocketOptions.java 2018-11-28 16:36:35.072692994 +0000 +++ new/src/jdk.net/linux/classes/jdk/net/LinuxRdmaSocketOptions.java 2018-11-28 16:36:34.696693007 +0000 @@ -30,7 +30,20 @@ class LinuxRdmaSocketOptions extends PlatformRdmaSocketOptions { - public LinuxRdmaSocketOptions() { } + private static final UnsupportedOperationException unsupported; + + private static final Void checkSupported() { + if (unsupported != null) + throw new UnsupportedOperationException(unsupported.getMessage(), unsupported); + else + return null; + } + + public LinuxRdmaSocketOptions() { + this(checkSupported()); + } + + private LinuxRdmaSocketOptions(Void unused) { } @Override native void setSockOpt(int fd, int opt, int value) throws SocketException; @@ -48,7 +61,14 @@ return null; } }); - init(); + UnsupportedOperationException uoe = null; + try { + init(); + } catch (UnsupportedOperationException e) { + uoe = e; + } + unsupported = uoe; } - private static native void init(); + + private static native void init() throws UnsupportedOperationException; } --- old/src/jdk.net/share/classes/jdk/net/RdmaSocketOptions.java 2018-11-28 16:36:35.760692971 +0000 +++ new/src/jdk.net/share/classes/jdk/net/RdmaSocketOptions.java 2018-11-28 16:36:35.384692984 +0000 @@ -77,7 +77,7 @@ /** * The integer size of the underlying RDMA receive queue used by the * platform for network I/O. - * + * * The initial/default size of the RDMA receive queue and the range of * allowable values is system and device dependent although a negative * size is not allowed. @@ -94,7 +94,7 @@ /** * The integer size of the underlying RDMA inline data used by the * platform for network I/O. - * + * * The initial/default size of the RDMA inline data and the range of * allowable values is system and device dependent although a negative * size is not allowed. @@ -241,6 +241,8 @@ c = (Class)Class.forName(cn); return c.getConstructor(new Class[] { }).newInstance(); } catch (ReflectiveOperationException x) { + if (x.getCause() instanceof UnsupportedOperationException) + throw (UnsupportedOperationException)x.getCause(); throw new AssertionError(x); } } @@ -252,8 +254,13 @@ return System.getProperty("os.name"); } }); - if ("Linux".equals(osname)) - return newInstance("jdk.net.LinuxRdmaSocketOptions"); + if ("Linux".equals(osname)) { + try { + return newInstance("jdk.net.LinuxRdmaSocketOptions"); + } catch (UnsupportedOperationException uoe) { + return new PlatformRdmaSocketOptions(); + } + } return new PlatformRdmaSocketOptions(); } --- old/test/jdk/jdk/net/RdmaSockets/rsocket/RsocketTest.java 2018-11-28 16:36:36.436692947 +0000 +++ new/test/jdk/jdk/net/RdmaSockets/rsocket/RsocketTest.java 2018-11-28 16:36:36.068692960 +0000 @@ -50,13 +50,19 @@ supported = isRsocketAvailable0(); } if (!supported) { + checkUnsupported(); + } + return supported; + } + + static void checkUnsupported() throws IOException { + for (int i=0; i<3; i++) { checkThrowsUOE(jdk.net.RdmaSockets::openSocket); checkThrowsUOE(jdk.net.RdmaSockets::openServerSocket); checkThrowsUOE(jdk.net.RdmaSockets::openSocketChannel); checkThrowsUOE(jdk.net.RdmaSockets::openServerSocketChannel); checkThrowsUOE(jdk.net.RdmaSockets::openSelector); } - return supported; } static void checkThrowsUOE(ThrowingRunnable runnable) throws IOException {