8235193: (dc) Remove JNI overhead from DatagramChannel.send implementation

Reviewed-by: chegar
This commit is contained in:
Alan Bateman 2019-12-04 16:37:00 +00:00
parent 386b387ef2
commit e7d68cd13b
10 changed files with 438 additions and 159 deletions

View file

@ -129,25 +129,20 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jclass clazz,
JNIEXPORT jint JNICALL
Java_sun_nio_ch_DatagramChannelImpl_send0(JNIEnv *env, jclass clazz,
jboolean preferIPv6, jobject fdo, jlong address,
jint len, jobject destAddress, jint destPort)
jobject fdo, jlong bufAddress, jint len,
jlong targetAddress, jint targetAddressLen)
{
jint fd = fdval(env, fdo);
void *buf = (void *)jlong_to_ptr(address);
SOCKETADDRESS sa;
int sa_len = 0;
jint n = 0;
void *buf = (void *)jlong_to_ptr(bufAddress);
SOCKETADDRESS *sa = (SOCKETADDRESS *)jlong_to_ptr(targetAddress);
socklen_t sa_len = (socklen_t) targetAddressLen;
jint n;
if (len > MAX_PACKET_LEN) {
len = MAX_PACKET_LEN;
}
if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
&sa_len, preferIPv6) != 0) {
return IOS_THROWN;
}
n = sendto(fd, buf, len, 0, &sa.sa, sa_len);
n = sendto(fd, buf, len, 0, (struct sockaddr *)sa, sa_len);
if (n < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
return IOS_UNAVAILABLE;