< prev index next >

src/java.base/share/classes/java/net/ServerSocket.java

Print this page

        

@@ -74,14 +74,15 @@
      * Are we using an older SocketImpl?
      */
     private boolean oldImpl = false;
 
     /**
-     * Package-private constructor to create a ServerSocket associated with
-     * the given SocketImpl.
+     * Creates a server socket with a user-specified SocketImpl.
+     *
+     * @param      impl the user-specified SocketImpl
      */
-    ServerSocket(SocketImpl impl) {
+    protected ServerSocket(SocketImpl impl) {
         this.impl = impl;
         impl.setServerSocket(this);
     }
 
     /**

@@ -988,10 +989,11 @@
         return getImpl().getOption(name);
     }
 
     private static Set<SocketOption<?>> options;
     private static boolean optionsSet = false;
+    private static boolean rdmaOptionsSet = false;
 
     /**
      * Returns a set of the socket options supported by this server socket.
      *
      * This method will continue to return the set of options even after

@@ -1002,20 +1004,28 @@
      *
      * @since 9
      */
     public Set<SocketOption<?>> supportedOptions() {
         synchronized (ServerSocket.class) {
-            if (optionsSet) {
+            String currentImpl = impl.getClass().getName();
+            boolean rdma = currentImpl.equals("rdma.ch.RdmaSocketImpl");
+            if ((rdma && rdmaOptionsSet) || (!rdma && optionsSet)) {
                 return options;
             }
             try {
                 SocketImpl impl = getImpl();
                 options = Collections.unmodifiableSet(impl.supportedOptions());
             } catch (IOException e) {
                 options = Collections.emptySet();
             }
+            if (rdma) {
+                rdmaOptionsSet = true;
+                optionsSet = false;
+            } else {
+                rdmaOptionsSet = false;
             optionsSet = true;
+            }
             return options;
         }
     }
 
     static {
< prev index next >