src/java.base/unix/native/libnio/ch/DatagramChannelImpl.c
changeset 59329 289000934908
parent 50275 69204b98dc3d
--- a/src/java.base/unix/native/libnio/ch/DatagramChannelImpl.c	Fri Nov 29 14:11:50 2019 -0800
+++ b/src/java.base/unix/native/libnio/ch/DatagramChannelImpl.c	Sat Nov 30 16:21:19 2019 +0000
@@ -23,11 +23,6 @@
  * questions.
  */
 
-#include "jni.h"
-#include "jni_util.h"
-#include "jvm.h"
-#include "jlong.h"
-
 #include <netdb.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -39,49 +34,17 @@
 #include <netinet/in.h>
 #endif
 
+#include "jni.h"
+#include "jni_util.h"
+#include "jlong.h"
 #include "net_util.h"
-#include "net_util_md.h"
 #include "nio.h"
 #include "nio_util.h"
 
 #include "sun_nio_ch_DatagramChannelImpl.h"
 
-static jfieldID dci_senderID;   /* sender in sun.nio.ch.DatagramChannelImpl */
-static jfieldID dci_senderAddrID; /* sender InetAddress in sun.nio.ch.DatagramChannelImpl */
-static jfieldID dci_senderPortID; /* sender port in sun.nio.ch.DatagramChannelImpl */
-static jclass isa_class;        /* java.net.InetSocketAddress */
-static jmethodID isa_ctorID;    /*   .InetSocketAddress(InetAddress, int) */
-
 JNIEXPORT void JNICALL
-Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz)
-{
-    clazz = (*env)->FindClass(env, "java/net/InetSocketAddress");
-    CHECK_NULL(clazz);
-    isa_class = (*env)->NewGlobalRef(env, clazz);
-    if (isa_class == NULL) {
-        JNU_ThrowOutOfMemoryError(env, NULL);
-        return;
-    }
-    isa_ctorID = (*env)->GetMethodID(env, clazz, "<init>",
-                                     "(Ljava/net/InetAddress;I)V");
-    CHECK_NULL(isa_ctorID);
-
-    clazz = (*env)->FindClass(env, "sun/nio/ch/DatagramChannelImpl");
-    CHECK_NULL(clazz);
-    dci_senderID = (*env)->GetFieldID(env, clazz, "sender",
-                                      "Ljava/net/SocketAddress;");
-    CHECK_NULL(dci_senderID);
-    dci_senderAddrID = (*env)->GetFieldID(env, clazz,
-                                          "cachedSenderInetAddress",
-                                          "Ljava/net/InetAddress;");
-    CHECK_NULL(dci_senderAddrID);
-    dci_senderPortID = (*env)->GetFieldID(env, clazz,
-                                          "cachedSenderPort", "I");
-    CHECK_NULL(dci_senderPortID);
-}
-
-JNIEXPORT void JNICALL
-Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
+Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jclass clazz,
                                                 jobject fdo, jboolean isIPv6)
 {
     jint fd = fdval(env, fdo);
@@ -122,17 +85,17 @@
 }
 
 JNIEXPORT jint JNICALL
-Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
-                                             jobject fdo, jlong address,
-                                             jint len, jboolean connected)
+Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jclass clazz,
+                                             jobject fdo, jlong bufAddress,
+                                             jint len, jlong senderAddress,
+                                             jboolean connected)
 {
     jint fd = fdval(env, fdo);
-    void *buf = (void *)jlong_to_ptr(address);
-    SOCKETADDRESS sa;
+    void *buf = (void *)jlong_to_ptr(bufAddress);
+    SOCKETADDRESS *sa = (SOCKETADDRESS *)jlong_to_ptr(senderAddress);
     socklen_t sa_len = sizeof(SOCKETADDRESS);
     jboolean retry = JNI_FALSE;
-    jint n = 0;
-    jobject senderAddr;
+    jint n;
 
     if (len > MAX_PACKET_LEN) {
         len = MAX_PACKET_LEN;
@@ -140,7 +103,7 @@
 
     do {
         retry = JNI_FALSE;
-        n = recvfrom(fd, buf, len, 0, &sa.sa, &sa_len);
+        n = recvfrom(fd, buf, len, 0, (struct sockaddr *)sa, &sa_len);
         if (n < 0) {
             if (errno == EAGAIN || errno == EWOULDBLOCK) {
                 return IOS_UNAVAILABLE;
@@ -152,8 +115,7 @@
                 if (connected == JNI_FALSE) {
                     retry = JNI_TRUE;
                 } else {
-                    JNU_ThrowByName(env, JNU_JAVANETPKG
-                                    "PortUnreachableException", 0);
+                    JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0);
                     return IOS_THROWN;
                 }
             } else {
@@ -162,41 +124,11 @@
         }
     } while (retry == JNI_TRUE);
 
-    /*
-     * If the source address and port match the cached address
-     * and port in DatagramChannelImpl then we don't need to
-     * create InetAddress and InetSocketAddress objects.
-     */
-    senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
-    if (senderAddr != NULL) {
-        if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) {
-            senderAddr = NULL;
-        } else {
-            jint port = (*env)->GetIntField(env, this, dci_senderPortID);
-            if (port != NET_GetPortFromSockaddr(&sa)) {
-                senderAddr = NULL;
-            }
-        }
-    }
-    if (senderAddr == NULL) {
-        jobject isa = NULL;
-        int port = 0;
-        jobject ia = NET_SockaddrToInetAddress(env, &sa, &port);
-        if (ia != NULL) {
-            isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
-        }
-        CHECK_NULL_RETURN(isa, IOS_THROWN);
-
-        (*env)->SetObjectField(env, this, dci_senderAddrID, ia);
-        (*env)->SetIntField(env, this, dci_senderPortID,
-                            NET_GetPortFromSockaddr(&sa));
-        (*env)->SetObjectField(env, this, dci_senderID, isa);
-    }
     return n;
 }
 
 JNIEXPORT jint JNICALL
-Java_sun_nio_ch_DatagramChannelImpl_send0(JNIEnv *env, jobject this,
+Java_sun_nio_ch_DatagramChannelImpl_send0(JNIEnv *env, jclass clazz,
                                           jboolean preferIPv6, jobject fdo, jlong address,
                                           jint len, jobject destAddress, jint destPort)
 {