Pass struct's per pointer to eliminate memory copy.
Motivation: Before struct's were passed per value and not pointer. This did enforce a memory copy which is not needed. Modifications: - Use "const struct....*" as replacement Result: No more unnecessary memory copies
This commit is contained in:
parent
01bc2d6d80
commit
6c24dd4d8f
@ -145,17 +145,17 @@ static inline int setOption(JNIEnv* env, jint fd, int level, int optname, const
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject createInetSocketAddress(JNIEnv* env, struct sockaddr_storage addr) {
|
jobject createInetSocketAddress(JNIEnv* env, const struct sockaddr_storage* addr) {
|
||||||
char ipstr[INET6_ADDRSTRLEN];
|
char ipstr[INET6_ADDRSTRLEN];
|
||||||
int port;
|
int port;
|
||||||
jstring ipString;
|
jstring ipString;
|
||||||
if (addr.ss_family == AF_INET) {
|
if (addr->ss_family == AF_INET) {
|
||||||
struct sockaddr_in* s = (struct sockaddr_in*) &addr;
|
struct sockaddr_in* s = (struct sockaddr_in*) addr;
|
||||||
port = ntohs(s->sin_port);
|
port = ntohs(s->sin_port);
|
||||||
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
|
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
|
||||||
ipString = (*env)->NewStringUTF(env, ipstr);
|
ipString = (*env)->NewStringUTF(env, ipstr);
|
||||||
} else {
|
} else {
|
||||||
struct sockaddr_in6* s = (struct sockaddr_in6*) &addr;
|
struct sockaddr_in6* s = (struct sockaddr_in6*) addr;
|
||||||
port = ntohs(s->sin6_port);
|
port = ntohs(s->sin6_port);
|
||||||
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
|
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
|
||||||
if (strncasecmp(ipstr, ip4prefix, 7) == 0) {
|
if (strncasecmp(ipstr, ip4prefix, 7) == 0) {
|
||||||
@ -174,11 +174,11 @@ jobject createInetSocketAddress(JNIEnv* env, struct sockaddr_storage addr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int addressLength(struct sockaddr_storage addr) {
|
static inline int addressLength(const struct sockaddr_storage* addr) {
|
||||||
if (addr.ss_family == AF_INET) {
|
if (addr->ss_family == AF_INET) {
|
||||||
return 8;
|
return 8;
|
||||||
} else {
|
} else {
|
||||||
struct sockaddr_in6* s = (struct sockaddr_in6*) &addr;
|
struct sockaddr_in6* s = (struct sockaddr_in6*) addr;
|
||||||
if (s->sin6_addr.s6_addr[0] == 0x00 && s->sin6_addr.s6_addr[1] == 0x00 && s->sin6_addr.s6_addr[2] == 0x00 && s->sin6_addr.s6_addr[3] == 0x00 && s->sin6_addr.s6_addr[4] == 0x00
|
if (s->sin6_addr.s6_addr[0] == 0x00 && s->sin6_addr.s6_addr[1] == 0x00 && s->sin6_addr.s6_addr[2] == 0x00 && s->sin6_addr.s6_addr[3] == 0x00 && s->sin6_addr.s6_addr[4] == 0x00
|
||||||
&& s->sin6_addr.s6_addr[5] == 0x00 && s->sin6_addr.s6_addr[6] == 0x00 && s->sin6_addr.s6_addr[7] == 0x00 && s->sin6_addr.s6_addr[8] == 0x00 && s->sin6_addr.s6_addr[9] == 0x00
|
&& s->sin6_addr.s6_addr[5] == 0x00 && s->sin6_addr.s6_addr[6] == 0x00 && s->sin6_addr.s6_addr[7] == 0x00 && s->sin6_addr.s6_addr[8] == 0x00 && s->sin6_addr.s6_addr[9] == 0x00
|
||||||
&& s->sin6_addr.s6_addr[10] == 0xff && s->sin6_addr.s6_addr[11] == 0xff) {
|
&& s->sin6_addr.s6_addr[10] == 0xff && s->sin6_addr.s6_addr[11] == 0xff) {
|
||||||
@ -190,10 +190,10 @@ static inline int addressLength(struct sockaddr_storage addr) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void initInetSocketAddressArray(JNIEnv* env, struct sockaddr_storage addr, jbyteArray bArray, int offset, int len) {
|
static inline void initInetSocketAddressArray(JNIEnv* env, const struct sockaddr_storage* addr, jbyteArray bArray, int offset, int len) {
|
||||||
int port;
|
int port;
|
||||||
if (addr.ss_family == AF_INET) {
|
if (addr->ss_family == AF_INET) {
|
||||||
struct sockaddr_in* s = (struct sockaddr_in*) &addr;
|
struct sockaddr_in* s = (struct sockaddr_in*) addr;
|
||||||
port = ntohs(s->sin_port);
|
port = ntohs(s->sin_port);
|
||||||
|
|
||||||
// Encode address and port into the array
|
// Encode address and port into the array
|
||||||
@ -205,7 +205,7 @@ static inline void initInetSocketAddressArray(JNIEnv* env, struct sockaddr_stora
|
|||||||
(*env)->SetByteArrayRegion(env, bArray, offset, 4, (jbyte*) &s->sin_addr.s_addr);
|
(*env)->SetByteArrayRegion(env, bArray, offset, 4, (jbyte*) &s->sin_addr.s_addr);
|
||||||
(*env)->SetByteArrayRegion(env, bArray, offset + 4, 4, (jbyte*) &a);
|
(*env)->SetByteArrayRegion(env, bArray, offset + 4, 4, (jbyte*) &a);
|
||||||
} else {
|
} else {
|
||||||
struct sockaddr_in6* s = (struct sockaddr_in6*) &addr;
|
struct sockaddr_in6* s = (struct sockaddr_in6*) addr;
|
||||||
port = ntohs(s->sin6_port);
|
port = ntohs(s->sin6_port);
|
||||||
|
|
||||||
if (len == 8) {
|
if (len == 8) {
|
||||||
@ -238,7 +238,7 @@ static inline void initInetSocketAddressArray(JNIEnv* env, struct sockaddr_stora
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static jbyteArray createInetSocketAddressArray(JNIEnv* env, struct sockaddr_storage addr) {
|
static jbyteArray createInetSocketAddressArray(JNIEnv* env, const struct sockaddr_storage* addr) {
|
||||||
int len = addressLength(addr);
|
int len = addressLength(addr);
|
||||||
jbyteArray bArray = (*env)->NewByteArray(env, len);
|
jbyteArray bArray = (*env)->NewByteArray(env, len);
|
||||||
|
|
||||||
@ -246,17 +246,17 @@ static jbyteArray createInetSocketAddressArray(JNIEnv* env, struct sockaddr_stor
|
|||||||
return bArray;
|
return bArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
static jobject createDatagramSocketAddress(JNIEnv* env, struct sockaddr_storage addr, int len) {
|
static jobject createDatagramSocketAddress(JNIEnv* env, const struct sockaddr_storage* addr, int len) {
|
||||||
char ipstr[INET6_ADDRSTRLEN];
|
char ipstr[INET6_ADDRSTRLEN];
|
||||||
int port;
|
int port;
|
||||||
jstring ipString;
|
jstring ipString;
|
||||||
if (addr.ss_family == AF_INET) {
|
if (addr->ss_family == AF_INET) {
|
||||||
struct sockaddr_in* s = (struct sockaddr_in*) &addr;
|
struct sockaddr_in* s = (struct sockaddr_in*) addr;
|
||||||
port = ntohs(s->sin_port);
|
port = ntohs(s->sin_port);
|
||||||
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
|
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
|
||||||
ipString = (*env)->NewStringUTF(env, ipstr);
|
ipString = (*env)->NewStringUTF(env, ipstr);
|
||||||
} else {
|
} else {
|
||||||
struct sockaddr_in6* s = (struct sockaddr_in6*) &addr;
|
struct sockaddr_in6* s = (struct sockaddr_in6*) addr;
|
||||||
port = ntohs(s->sin6_port);
|
port = ntohs(s->sin6_port);
|
||||||
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
|
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
|
||||||
|
|
||||||
@ -275,7 +275,7 @@ static jobject createDatagramSocketAddress(JNIEnv* env, struct sockaddr_storage
|
|||||||
return socketAddr;
|
return socketAddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init_sockaddr(JNIEnv* env, jbyteArray address, jint scopeId, jint jport, struct sockaddr_storage* addr) {
|
static int init_sockaddr(JNIEnv* env, jbyteArray address, jint scopeId, jint jport, const struct sockaddr_storage* addr) {
|
||||||
uint16_t port = htons((uint16_t) jport);
|
uint16_t port = htons((uint16_t) jport);
|
||||||
// Use GetPrimitiveArrayCritical and ReleasePrimitiveArrayCritical to signal the VM that we really would like
|
// Use GetPrimitiveArrayCritical and ReleasePrimitiveArrayCritical to signal the VM that we really would like
|
||||||
// to not do a memory copy here. This is ok as we not do any blocking action here anyway.
|
// to not do a memory copy here. This is ok as we not do any blocking action here anyway.
|
||||||
@ -705,7 +705,7 @@ JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_writeAddress0(JNIEnv*
|
|||||||
return _write(env, clazz, fd, (void*) address, pos, limit);
|
return _write(env, clazz, fd, (void*) address, pos, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline jint _sendTo(JNIEnv* env, jint fd, void* buffer, jint pos, jint limit ,jbyteArray address, jint scopeId, jint port) {
|
static inline jint _sendTo(JNIEnv* env, jint fd, void* buffer, jint pos, jint limit, jbyteArray address, jint scopeId, jint port) {
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage addr;
|
||||||
if (init_sockaddr(env, address, scopeId, port, &addr) == -1) {
|
if (init_sockaddr(env, address, scopeId, port, &addr) == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -825,7 +825,7 @@ static inline jobject recvFrom0(JNIEnv* env, jint fd, void* buffer, jint pos, ji
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return createDatagramSocketAddress(env, addr, res);
|
return createDatagramSocketAddress(env, &addr, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jobject JNICALL Java_io_netty_channel_epoll_Native_recvFrom(JNIEnv* env, jclass clazz, jint fd, jobject jbuffer, jint pos, jint limit) {
|
JNIEXPORT jobject JNICALL Java_io_netty_channel_epoll_Native_recvFrom(JNIEnv* env, jclass clazz, jint fd, jobject jbuffer, jint pos, jint limit) {
|
||||||
@ -1048,11 +1048,11 @@ JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_accept0(JNIEnv* env, j
|
|||||||
return -err;
|
return -err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int len = addressLength(addr);
|
int len = addressLength(&addr);
|
||||||
|
|
||||||
// Fill in remote address details
|
// Fill in remote address details
|
||||||
(*env)->SetByteArrayRegion(env, acceptedAddress, 0, 4, (jbyte*) &len);
|
(*env)->SetByteArrayRegion(env, acceptedAddress, 0, 4, (jbyte*) &len);
|
||||||
initInetSocketAddressArray(env, addr, acceptedAddress, 1, len);
|
initInetSocketAddressArray(env, &addr, acceptedAddress, 1, len);
|
||||||
|
|
||||||
if (accept4) {
|
if (accept4) {
|
||||||
return socketFd;
|
return socketFd;
|
||||||
@ -1109,7 +1109,7 @@ JNIEXPORT jbyteArray JNICALL Java_io_netty_channel_epoll_Native_remoteAddress0(J
|
|||||||
if (getpeername(fd, (struct sockaddr*) &addr, &len) == -1) {
|
if (getpeername(fd, (struct sockaddr*) &addr, &len) == -1) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return createInetSocketAddressArray(env, addr);
|
return createInetSocketAddressArray(env, &addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jbyteArray JNICALL Java_io_netty_channel_epoll_Native_localAddress0(JNIEnv* env, jclass clazz, jint fd) {
|
JNIEXPORT jbyteArray JNICALL Java_io_netty_channel_epoll_Native_localAddress0(JNIEnv* env, jclass clazz, jint fd) {
|
||||||
@ -1120,7 +1120,7 @@ JNIEXPORT jbyteArray JNICALL Java_io_netty_channel_epoll_Native_localAddress0(JN
|
|||||||
if (getsockname(fd, (struct sockaddr*) &addr, &len) == -1) {
|
if (getsockname(fd, (struct sockaddr*) &addr, &len) == -1) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return createInetSocketAddressArray(env, addr);
|
return createInetSocketAddressArray(env, &addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_io_netty_channel_epoll_Native_setReuseAddress(JNIEnv* env, jclass clazz, jint fd, jint optval) {
|
JNIEXPORT void JNICALL Java_io_netty_channel_epoll_Native_setReuseAddress(JNIEnv* env, jclass clazz, jint fd, jint optval) {
|
||||||
|
Loading…
Reference in New Issue
Block a user