8220738: (sc) Move ServerSocketChannelImpl remaining native method to Net
Reviewed-by: bpb
--- a/src/java.base/share/classes/sun/nio/ch/Net.java Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/share/classes/sun/nio/ch/Net.java Sat Mar 16 12:31:31 2019 +0000
@@ -482,6 +482,10 @@
int remotePort)
throws IOException;
+ public static native int accept(FileDescriptor fd,
+ FileDescriptor newfd,
+ InetSocketAddress[] isaa)
+ throws IOException;
public static final int SHUT_RD = 0;
public static final int SHUT_WR = 1;
--- a/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Sat Mar 16 12:31:31 2019 +0000
@@ -58,7 +58,7 @@
implements SelChImpl
{
// Used to make native close and configure calls
- private static NativeDispatcher nd;
+ private static final NativeDispatcher nd = new SocketDispatcher();
// Our file descriptor
private final FileDescriptor fd;
@@ -97,7 +97,7 @@
ServerSocketChannelImpl(SelectorProvider sp) throws IOException {
super(sp);
- this.fd = Net.serverSocket(true);
+ this.fd = Net.serverSocket(true);
this.fdVal = IOUtil.fdVal(fd);
}
@@ -261,46 +261,44 @@
@Override
public SocketChannel accept() throws IOException {
+ int n = 0;
+ FileDescriptor newfd = new FileDescriptor();
+ InetSocketAddress[] isaa = new InetSocketAddress[1];
+
acceptLock.lock();
try {
- int n = 0;
- FileDescriptor newfd = new FileDescriptor();
- InetSocketAddress[] isaa = new InetSocketAddress[1];
-
boolean blocking = isBlocking();
try {
begin(blocking);
do {
- n = accept(this.fd, newfd, isaa);
+ n = Net.accept(this.fd, newfd, isaa);
} while (n == IOStatus.INTERRUPTED && isOpen());
} finally {
end(blocking, n > 0);
assert IOStatus.check(n);
}
- if (n < 1)
- return null;
+ } finally {
+ acceptLock.unlock();
+ }
+ if (n < 1)
+ return null;
+
+ InetSocketAddress isa = isaa[0];
+ try {
// newly accepted socket is initially in blocking mode
IOUtil.configureBlocking(newfd, true);
- InetSocketAddress isa = isaa[0];
- SocketChannel sc = new SocketChannelImpl(provider(), newfd, isa);
-
// check permitted to accept connections from the remote address
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
- try {
- sm.checkAccept(isa.getAddress().getHostAddress(), isa.getPort());
- } catch (SecurityException x) {
- sc.close();
- throw x;
- }
+ sm.checkAccept(isa.getAddress().getHostAddress(), isa.getPort());
}
- return sc;
-
- } finally {
- acceptLock.unlock();
+ return new SocketChannelImpl(provider(), newfd, isa);
+ } catch (Exception e) {
+ nd.close(newfd);
+ throw e;
}
}
@@ -508,38 +506,4 @@
sb.append(']');
return sb.toString();
}
-
- /**
- * Accept a connection on a socket.
- *
- * @implNote Wrap native call to allow instrumentation.
- */
- private int accept(FileDescriptor ssfd,
- FileDescriptor newfd,
- InetSocketAddress[] isaa)
- throws IOException
- {
- return accept0(ssfd, newfd, isaa);
- }
-
- // -- Native methods --
-
- // Accepts a new connection, setting the given file descriptor to refer to
- // the new socket and setting isaa[0] to the socket's remote address.
- // Returns 1 on success, or IOStatus.UNAVAILABLE (if non-blocking and no
- // connections are pending) or IOStatus.INTERRUPTED.
- //
- private native int accept0(FileDescriptor ssfd,
- FileDescriptor newfd,
- InetSocketAddress[] isaa)
- throws IOException;
-
- private static native void initIDs();
-
- static {
- IOUtil.load();
- initIDs();
- nd = new SocketDispatcher();
- }
-
}
--- a/src/java.base/unix/classes/sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/unix/classes/sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java Sat Mar 16 12:31:31 2019 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -141,7 +141,7 @@
Throwable exc = null;
try {
begin();
- int n = accept(this.fd, newfd, isaa);
+ int n = Net.accept(this.fd, newfd, isaa);
// spurious wakeup, is this possible?
if (n == IOStatus.UNAVAILABLE) {
@@ -221,7 +221,7 @@
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkAccept(remote.getAddress().getHostAddress(),
- remote.getPort());
+ remote.getPort());
}
return null;
}
@@ -230,7 +230,7 @@
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkAccept(remote.getAddress().getHostAddress(),
- remote.getPort());
+ remote.getPort());
}
}
} catch (SecurityException x) {
@@ -277,7 +277,7 @@
try {
begin();
- int n = accept(this.fd, newfd, isaa);
+ int n = Net.accept(this.fd, newfd, isaa);
if (n == IOStatus.UNAVAILABLE) {
// need calling context when there is security manager as
@@ -294,7 +294,7 @@
this.acceptAttachment = att;
}
this.acceptAcc = (System.getSecurityManager() == null) ?
- null : AccessController.getContext();
+ null : AccessController.getContext();
this.acceptPending = true;
}
@@ -331,33 +331,4 @@
return null;
}
}
-
- /**
- * Accept a connection on a socket.
- *
- * @implNote Wrap native call to allow instrumentation.
- */
- private int accept(FileDescriptor ssfd, FileDescriptor newfd,
- InetSocketAddress[] isaa)
- throws IOException
- {
- return accept0(ssfd, newfd, isaa);
- }
-
- // -- Native methods --
-
- private static native void initIDs();
-
- // Accepts a new connection, setting the given file descriptor to refer to
- // the new socket and setting isaa[0] to the socket's remote address.
- // Returns 1 on success, or IOStatus.UNAVAILABLE.
- //
- private native int accept0(FileDescriptor ssfd, FileDescriptor newfd,
- InetSocketAddress[] isaa)
- throws IOException;
-
- static {
- IOUtil.load();
- initIDs();
- }
}
--- a/src/java.base/unix/native/libnio/ch/IOUtil.c Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/unix/native/libnio/ch/IOUtil.c Sat Mar 16 12:31:31 2019 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -63,7 +63,7 @@
JNIEXPORT void JNICALL
Java_sun_nio_ch_IOUtil_setfdVal(JNIEnv *env, jclass clazz, jobject fdo, jint val)
{
- (*env)->SetIntField(env, fdo, fd_fdID, val);
+ setfdval(env, fdo, val);
}
static int
@@ -228,3 +228,10 @@
{
return (*env)->GetIntField(env, fdo, fd_fdID);
}
+
+void
+setfdval(JNIEnv *env, jobject fdo, jint val) {
+ (*env)->SetIntField(env, fdo, fd_fdID, val);
+}
+
+
--- a/src/java.base/unix/native/libnio/ch/Net.c Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/unix/native/libnio/ch/Net.c Sat Mar 16 12:31:31 2019 +0000
@@ -146,9 +146,22 @@
#endif /* _AIX */
+static jclass isa_class; /* java.net.InetSocketAddress */
+static jmethodID isa_ctorID; /* InetSocketAddress(InetAddress, int) */
+
JNIEXPORT void JNICALL
Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz)
{
+ jclass cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
+ CHECK_NULL(cls);
+ isa_class = (*env)->NewGlobalRef(env, cls);
+ if (isa_class == NULL) {
+ JNU_ThrowOutOfMemoryError(env, NULL);
+ return;
+ }
+ isa_ctorID = (*env)->GetMethodID(env, cls, "<init>", "(Ljava/net/InetAddress;I)V");
+ CHECK_NULL(isa_ctorID);
+
initInetAddressIDs(env);
}
@@ -309,6 +322,51 @@
}
JNIEXPORT jint JNICALL
+Java_sun_nio_ch_Net_accept(JNIEnv *env, jclass clazz, jobject fdo, jobject newfdo,
+ jobjectArray isaa)
+{
+ jint fd = fdval(env, fdo);
+ jint newfd;
+ SOCKETADDRESS sa;
+ socklen_t sa_len = sizeof(SOCKETADDRESS);
+ jobject remote_ia;
+ jint remote_port = 0;
+ jobject isa;
+
+ /* accept connection but ignore ECONNABORTED */
+ for (;;) {
+ newfd = accept(fd, &sa.sa, &sa_len);
+ if (newfd >= 0) {
+ break;
+ }
+ if (errno != ECONNABORTED) {
+ break;
+ }
+ /* ECONNABORTED => restart accept */
+ }
+
+ if (newfd < 0) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
+ return IOS_UNAVAILABLE;
+ if (errno == EINTR)
+ return IOS_INTERRUPTED;
+ JNU_ThrowIOExceptionWithLastError(env, "Accept failed");
+ return IOS_THROWN;
+ }
+
+ setfdval(env, newfdo, newfd);
+
+ remote_ia = NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port);
+ CHECK_NULL_RETURN(remote_ia, IOS_THROWN);
+
+ isa = (*env)->NewObject(env, isa_class, isa_ctorID, remote_ia, remote_port);
+ CHECK_NULL_RETURN(isa, IOS_THROWN);
+ (*env)->SetObjectArrayElement(env, isaa, 0, isa);
+
+ return 1;
+}
+
+JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
{
SOCKETADDRESS sa;
@@ -374,6 +432,33 @@
}
JNIEXPORT jint JNICALL
+Java_sun_nio_ch_Net_remotePort(JNIEnv *env, jclass clazz, jobject fdo)
+{
+ SOCKETADDRESS sa;
+ socklen_t sa_len = sizeof(sa);
+
+ if (getpeername(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
+ handleSocketError(env, errno);
+ return IOS_THROWN;
+ }
+ return NET_GetPortFromSockaddr(&sa);
+}
+
+JNIEXPORT jobject JNICALL
+Java_sun_nio_ch_Net_remoteInetAddress(JNIEnv *env, jclass clazz, jobject fdo)
+{
+ SOCKETADDRESS sa;
+ socklen_t sa_len = sizeof(sa);
+ int port;
+
+ if (getpeername(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
+ handleSocketError(env, errno);
+ return NULL;
+ }
+ return NET_SockaddrToInetAddress(env, &sa, &port);
+}
+
+JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_getIntOption0(JNIEnv *env, jclass clazz, jobject fdo,
jboolean mayNeedConversion, jint level, jint opt)
{
@@ -830,6 +915,7 @@
break;
case EADDRINUSE: /* Fall through */
case EADDRNOTAVAIL:
+ case EACCES:
xn = JNU_JAVANETPKG "BindException";
break;
default:
--- a/src/java.base/unix/native/libnio/ch/ServerSocketChannelImpl.c Sat Mar 16 21:27:15 2019 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <stdlib.h>
-#include <netdb.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#if __linux__
-#include <netinet/in.h>
-#endif
-
-#if defined(__solaris__) && !defined(_SOCKLEN_T)
-typedef size_t socklen_t; /* New in SunOS 5.7, so need this for 5.6 */
-#endif
-
-#include "jni.h"
-#include "jni_util.h"
-#include "net_util.h"
-#include "jvm.h"
-#include "jlong.h"
-#include "sun_nio_ch_ServerSocketChannelImpl.h"
-#include "nio.h"
-#include "nio_util.h"
-
-
-static jfieldID fd_fdID; /* java.io.FileDescriptor.fd */
-static jclass isa_class; /* java.net.InetSocketAddress */
-static jmethodID isa_ctorID; /* .InetSocketAddress(InetAddress, int) */
-
-
-JNIEXPORT void JNICALL
-Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(JNIEnv *env, jclass c)
-{
- jclass cls;
-
- cls = (*env)->FindClass(env, "java/io/FileDescriptor");
- CHECK_NULL(cls);
- fd_fdID = (*env)->GetFieldID(env, cls, "fd", "I");
- CHECK_NULL(fd_fdID);
-
- cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
- CHECK_NULL(cls);
- isa_class = (*env)->NewGlobalRef(env, cls);
- if (isa_class == NULL) {
- JNU_ThrowOutOfMemoryError(env, NULL);
- return;
- }
- isa_ctorID = (*env)->GetMethodID(env, cls, "<init>",
- "(Ljava/net/InetAddress;I)V");
- CHECK_NULL(isa_ctorID);
-}
-
-JNIEXPORT jint JNICALL
-Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv *env, jobject this,
- jobject ssfdo, jobject newfdo,
- jobjectArray isaa)
-{
- jint ssfd = (*env)->GetIntField(env, ssfdo, fd_fdID);
- jint newfd;
- SOCKETADDRESS sa;
- socklen_t sa_len = sizeof(SOCKETADDRESS);
- jobject remote_ia = 0;
- jobject isa;
- jint remote_port = 0;
-
- /*
- * accept connection but ignore ECONNABORTED indicating that
- * a connection was eagerly accepted but was reset before
- * accept() was called.
- */
- for (;;) {
- newfd = accept(ssfd, &sa.sa, &sa_len);
- if (newfd >= 0) {
- break;
- }
- if (errno != ECONNABORTED) {
- break;
- }
- /* ECONNABORTED => restart accept */
- }
-
- if (newfd < 0) {
- if (errno == EAGAIN || errno == EWOULDBLOCK)
- return IOS_UNAVAILABLE;
- if (errno == EINTR)
- return IOS_INTERRUPTED;
- JNU_ThrowIOExceptionWithLastError(env, "Accept failed");
- return IOS_THROWN;
- }
-
- (*env)->SetIntField(env, newfdo, fd_fdID, newfd);
- remote_ia = NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port);
- CHECK_NULL_RETURN(remote_ia, IOS_THROWN);
- isa = (*env)->NewObject(env, isa_class, isa_ctorID, remote_ia, remote_port);
- CHECK_NULL_RETURN(isa, IOS_THROWN);
- (*env)->SetObjectArrayElement(env, isaa, 0, isa);
- return 1;
-}
--- a/src/java.base/unix/native/libnio/ch/UnixAsynchronousServerSocketChannelImpl.c Sat Mar 16 21:27:15 2019 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "sun_nio_ch_UnixAsynchronousServerSocketChannelImpl.h"
-
-extern void Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(JNIEnv* env,
- jclass c);
-
-extern jint Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv* env,
- jobject this, jobject ssfdo, jobject newfdo, jobjectArray isaa);
-
-JNIEXPORT void JNICALL
-Java_sun_nio_ch_UnixAsynchronousServerSocketChannelImpl_initIDs(JNIEnv* env,
- jclass c)
-{
- Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(env, c);
-}
-
-JNIEXPORT jint JNICALL
-Java_sun_nio_ch_UnixAsynchronousServerSocketChannelImpl_accept0(JNIEnv* env,
- jobject this, jobject ssfdo, jobject newfdo, jobjectArray isaa)
-{
- return Java_sun_nio_ch_ServerSocketChannelImpl_accept0(env, this,
- ssfdo, newfdo, isaa);
-}
--- a/src/java.base/unix/native/libnio/ch/nio_util.h Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/unix/native/libnio/ch/nio_util.h Sat Mar 16 12:31:31 2019 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -55,6 +55,7 @@
/* Defined in IOUtil.c */
jint fdval(JNIEnv *env, jobject fdo);
+void setfdval(JNIEnv *env, jobject fdo, jint value);
jint convertReturnVal(JNIEnv *env, jint n, jboolean reading);
jlong convertLongReturnVal(JNIEnv *env, jlong n, jboolean reading);
--- a/src/java.base/windows/native/libnio/ch/IOUtil.c Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/windows/native/libnio/ch/IOUtil.c Sat Mar 16 12:31:31 2019 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -119,7 +119,7 @@
JNIEXPORT void JNICALL
Java_sun_nio_ch_IOUtil_setfdVal(JNIEnv *env, jclass clazz, jobject fdo, jint val)
{
- (*env)->SetIntField(env, fdo, fd_fdID, val);
+ setfdval(env, fdo, val);
}
@@ -198,6 +198,12 @@
return (*env)->GetIntField(env, fdo, fd_fdID);
}
+void
+setfdval(JNIEnv *env, jobject fdo, jint val)
+{
+ (*env)->SetIntField(env, fdo, fd_fdID, val);
+}
+
jlong
handleval(JNIEnv *env, jobject fdo)
{
--- a/src/java.base/windows/native/libnio/ch/Net.c Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/windows/native/libnio/ch/Net.c Sat Mar 16 12:31:31 2019 +0000
@@ -83,10 +83,23 @@
return IOS_THROWN;
}
+static jclass isa_class; /* java.net.InetSocketAddress */
+static jmethodID isa_ctorID; /* InetSocketAddress(InetAddress, int) */
+
JNIEXPORT void JNICALL
Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz)
{
- initInetAddressIDs(env);
+ jclass cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
+ CHECK_NULL(cls);
+ isa_class = (*env)->NewGlobalRef(env, cls);
+ if (isa_class == NULL) {
+ JNU_ThrowOutOfMemoryError(env, NULL);
+ return;
+ }
+ isa_ctorID = (*env)->GetMethodID(env, cls, "<init>", "(Ljava/net/InetAddress;I)V");
+ CHECK_NULL(isa_ctorID);
+
+ initInetAddressIDs(env);
}
JNIEXPORT jboolean JNICALL
@@ -192,7 +205,6 @@
}
}
-
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, jobject fdo,
jobject iao, jint port)
@@ -226,6 +238,42 @@
}
JNIEXPORT jint JNICALL
+Java_sun_nio_ch_Net_accept(JNIEnv *env, jclass clazz, jobject fdo, jobject newfdo,
+ jobjectArray isaa)
+{
+ jint fd = fdval(env,fdo);
+ jint newfd;
+ SOCKETADDRESS sa;
+ int addrlen = sizeof(sa);
+ jobject remote_ia;
+ jint remote_port = 0;
+ jobject isa;
+
+ memset((char *)&sa, 0, sizeof(sa));
+ newfd = (jint) accept(fd, &sa.sa, &addrlen);
+ if (newfd == INVALID_SOCKET) {
+ int theErr = (jint)WSAGetLastError();
+ if (theErr == WSAEWOULDBLOCK) {
+ return IOS_UNAVAILABLE;
+ }
+ JNU_ThrowIOExceptionWithLastError(env, "Accept failed");
+ return IOS_THROWN;
+ }
+
+ SetHandleInformation((HANDLE)(UINT_PTR)newfd, HANDLE_FLAG_INHERIT, 0);
+ setfdval(env, newfdo, newfd);
+
+ remote_ia = NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port);
+ CHECK_NULL_RETURN(remote_ia, IOS_THROWN);
+
+ isa = (*env)->NewObject(env, isa_class, isa_ctorID, remote_ia, remote_port);
+ CHECK_NULL_RETURN(isa, IOS_THROWN);
+ (*env)->SetObjectArrayElement(env, isaa, 0, isa);
+
+ return 1;
+}
+
+JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
{
SOCKETADDRESS sa;
--- a/src/java.base/windows/native/libnio/ch/ServerSocketChannelImpl.c Sat Mar 16 21:27:15 2019 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <windows.h>
-#include <winsock2.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <malloc.h>
-#include <sys/types.h>
-
-#include "jni.h"
-#include "jni_util.h"
-#include "jvm.h"
-#include "jlong.h"
-
-#include "nio.h"
-#include "nio_util.h"
-#include "net_util.h"
-
-#include "sun_nio_ch_ServerSocketChannelImpl.h"
-
-
-static jfieldID fd_fdID; /* java.io.FileDescriptor.fd */
-static jclass isa_class; /* java.net.InetSocketAddress */
-static jmethodID isa_ctorID; /* InetSocketAddress(InetAddress, int) */
-
-
-/**************************************************************
- * static method to store field IDs in initializers
- */
-
-JNIEXPORT void JNICALL
-Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(JNIEnv *env, jclass cls)
-{
- cls = (*env)->FindClass(env, "java/io/FileDescriptor");
- CHECK_NULL(cls);
- fd_fdID = (*env)->GetFieldID(env, cls, "fd", "I");
- CHECK_NULL(fd_fdID);
-
- cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
- CHECK_NULL(cls);
- isa_class = (*env)->NewGlobalRef(env, cls);
- if (isa_class == NULL) {
- JNU_ThrowOutOfMemoryError(env, NULL);
- return;
- }
- isa_ctorID = (*env)->GetMethodID(env, cls, "<init>",
- "(Ljava/net/InetAddress;I)V");
- CHECK_NULL(isa_ctorID);
-}
-
-JNIEXPORT void JNICALL
-Java_sun_nio_ch_ServerSocketChannelImpl_listen(JNIEnv *env, jclass cl,
- jobject fdo, jint backlog)
-{
- if (listen(fdval(env,fdo), backlog) == SOCKET_ERROR) {
- NET_ThrowNew(env, WSAGetLastError(), "listen");
- }
-}
-
-JNIEXPORT jint JNICALL
-Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv *env, jobject this,
- jobject ssfdo, jobject newfdo,
- jobjectArray isaa)
-{
- jint ssfd = (*env)->GetIntField(env, ssfdo, fd_fdID);
- jint newfd;
- SOCKETADDRESS sa;
- jobject remote_ia;
- int remote_port;
- jobject isa;
- int addrlen = sizeof(sa);
-
- memset((char *)&sa, 0, sizeof(sa));
- newfd = (jint)accept(ssfd, &sa.sa, &addrlen);
- if (newfd == INVALID_SOCKET) {
- int theErr = (jint)WSAGetLastError();
- if (theErr == WSAEWOULDBLOCK) {
- return IOS_UNAVAILABLE;
- }
- JNU_ThrowIOExceptionWithLastError(env, "Accept failed");
- return IOS_THROWN;
- }
-
- SetHandleInformation((HANDLE)(UINT_PTR)newfd, HANDLE_FLAG_INHERIT, 0);
- (*env)->SetIntField(env, newfdo, fd_fdID, newfd);
- remote_ia = NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port);
- CHECK_NULL_RETURN(remote_ia, IOS_THROWN);
-
- isa = (*env)->NewObject(env, isa_class, isa_ctorID, remote_ia, remote_port);
- CHECK_NULL_RETURN(isa, IOS_THROWN);
- (*env)->SetObjectArrayElement(env, isaa, 0, isa);
- return 1;
-}
--- a/src/java.base/windows/native/libnio/ch/nio_util.h Sat Mar 16 21:27:15 2019 +0900
+++ b/src/java.base/windows/native/libnio/ch/nio_util.h Sat Mar 16 12:31:31 2019 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -36,6 +36,7 @@
#define MAX_BUFFER_SIZE ((128*1024)-1)
jint fdval(JNIEnv *env, jobject fdo);
+void setfdval(JNIEnv *env, jobject fdo, jint val);
jlong handleval(JNIEnv *env, jobject fdo);
jint convertReturnVal(JNIEnv *env, jint n, jboolean r);
jlong convertLongReturnVal(JNIEnv *env, jlong n, jboolean r);
--- a/src/jdk.sctp/unix/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java Sat Mar 16 21:27:15 2019 +0900
+++ b/src/jdk.sctp/unix/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java Sat Mar 16 12:31:31 2019 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -230,7 +230,7 @@
return null;
thread = NativeThread.current();
for (;;) {
- n = accept0(fd, newfd, isaa);
+ n = Net.accept(fd, newfd, isaa);
if ((n == IOStatus.INTERRUPTED) && isOpen())
continue;
break;
@@ -412,22 +412,4 @@
return SctpNet.getLocalAddresses(fdVal);
}
}
-
- /* Native */
- private static native void initIDs();
-
- private static native int accept0(FileDescriptor ssfd,
- FileDescriptor newfd, InetSocketAddress[] isaa) throws IOException;
-
- static {
- IOUtil.load(); // loads nio & net native libraries
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("sctp");
- return null;
- }
- });
- initIDs();
- }
}
--- a/src/jdk.sctp/unix/native/libsctp/SctpServerChannelImpl.c Sat Mar 16 21:27:15 2019 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "sun_nio_ch_sctp_SctpServerChannelImpl.h"
-
-extern void Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(JNIEnv* env,
- jclass c);
-
-extern jint Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv* env,
- jobject this, jobject ssfdo, jobject newfdo, jobjectArray isaa);
-
-/*
- * Class: sun_nio_ch_sctp_SctpServerChannelImpl
- * Method: initIDs
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpServerChannelImpl_initIDs
- (JNIEnv* env, jclass c) {
- Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(env, c);
-}
-
-/*
- * Class: sun_nio_ch_sctp_SctpServerChannelImpl
- * Method: accept0
- * Signature: (Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;[Ljava/net/InetSocketAddress;)I
- */
-JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpServerChannelImpl_accept0
- (JNIEnv* env, jobject this, jobject ssfdo, jobject newfdo, jobjectArray isaa) {
- return Java_sun_nio_ch_ServerSocketChannelImpl_accept0(env, this,
- ssfdo, newfdo, isaa);
-}
--- a/test/jdk/com/sun/nio/sctp/SctpMultiChannel/SendFailed.java Sat Mar 16 21:27:15 2019 +0900
+++ b/test/jdk/com/sun/nio/sctp/SctpMultiChannel/SendFailed.java Sat Mar 16 12:31:31 2019 +0000
@@ -28,6 +28,7 @@
import com.sun.nio.sctp.*;
import java.io.IOException;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;