< prev index next >

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

Print this page

        

@@ -74,14 +74,16 @@
      * 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
+     * @since 12
      */
-    ServerSocket(SocketImpl impl) {
+    protected ServerSocket(SocketImpl impl) {
         this.impl = impl;
         impl.setServerSocket(this);
     }
 
     /**

@@ -988,10 +990,12 @@
         return getImpl().getOption(name);
     }
 
     private static Set<SocketOption<?>> options;
     private static boolean optionsSet = false;
+    private static Set<SocketOption<?>> rdmaOptions;
+    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 +1006,33 @@
      *
      * @since 9
      */
     public Set<SocketOption<?>> supportedOptions() {
         synchronized (ServerSocket.class) {
-            if (optionsSet) {
-                return options;
-            }
             try {
                 SocketImpl impl = getImpl();
-                options = Collections.unmodifiableSet(impl.supportedOptions());
+                String implName = impl.getClass().getName();
+                if (implName.equals("jdk.internal.net.rdma.RdmaSocketImpl")) {
+                    if (rdmaOptionsSet)
+                        return rdmaOptions;
+                    rdmaOptions = Collections.unmodifiableSet(
+                            impl.supportedOptions());
+                    rdmaOptionsSet = true;
+                    return rdmaOptions;
+                } else {
+                    if (optionsSet)
+                        return options;
+                    options = Collections.unmodifiableSet(
+                            impl.supportedOptions());
+                    optionsSet = true;
+                    return options;
+                }
             } catch (IOException e) {
                 options = Collections.emptySet();
+                rdmaOptions = Collections.emptySet();
             }
-            optionsSet = true;
+            //should not reach here
             return options;
         }
     }
 
     static {
< prev index next >