< 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 >