--- 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() {}