--- a/jdk/src/java.base/windows/native/libnet/AbstractPlainDatagramSocketImpl.c Wed Jul 30 11:08:41 2014 -0700
+++ b/jdk/src/java.base/windows/native/libnet/AbstractPlainDatagramSocketImpl.c Thu Aug 21 17:51:29 2014 +0100
@@ -32,9 +32,11 @@
#include "java_net_AbstractPlainDatagramSocketImpl.h"
-static jfieldID IO_fd_fdID;
+static jfieldID IO_fd_fdID = NULL;
+static jfieldID apdsi_fdID = NULL;
-static jfieldID apdsi_fdID;
+static jfieldID apdsi_fd1ID = NULL;
+static jclass two_stacks_clazz = NULL;
/*
@@ -48,10 +50,21 @@
apdsi_fdID = (*env)->GetFieldID(env, cls, "fd",
"Ljava/io/FileDescriptor;");
CHECK_NULL(apdsi_fdID);
-
IO_fd_fdID = NET_GetFileDescriptorID(env);
CHECK_NULL(IO_fd_fdID);
+ two_stacks_clazz = (*env)->FindClass(env, "java/net/TwoStacksPlainDatagramSocketImpl");
+ CHECK_NULL(two_stacks_clazz);
+
+ /* Handle both TwoStacks and DualStack here */
+
+ if (JNU_Equals(env, cls, two_stacks_clazz)) {
+ /* fd1 present only in TwoStack.. */
+ apdsi_fd1ID = (*env)->GetFieldID(env, cls, "fd1",
+ "Ljava/io/FileDescriptor;");
+ CHECK_NULL(apdsi_fd1ID);
+ }
+
JNU_CHECK_EXCEPTION(env);
}
@@ -63,20 +76,38 @@
JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
(JNIEnv *env, jobject this) {
SOCKET fd;
- int retval;
-
+ SOCKET fd1;
+ int rv = -1, rv1 = -1;
jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID);
- if (IS_NULL(fdObj)) {
+ if (!IS_NULL(fdObj)) {
+ int retval = 0;
+ fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
+ rv = ioctlsocket(fd, FIONREAD, &retval);
+ if (retval > 0) {
+ return retval;
+ }
+ }
+
+ if (!IS_NULL(apdsi_fd1ID)) {
+ /* TwoStacks */
+ jobject fd1Obj = (*env)->GetObjectField(env, this, apdsi_fd1ID);
+ if (!IS_NULL(fd1Obj)) {
+ int retval = 0;
+ fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID);
+ rv1 = ioctlsocket(fd1, FIONREAD, &retval);
+ if (retval > 0) {
+ return retval;
+ }
+ }
+ }
+
+ if (rv < 0 && rv1 < 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
- "Socket closed");
+ "Socket closed");
return -1;
}
- fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
- if (ioctlsocket(fd, FIONREAD, &retval) < 0) {
- return -1;
- }
- return retval;
+ return 0;
}