mturk 2005/04/13 06:17:42 Modified: jni/native/src network.c poll.c Log: Add offset for send and receive oprations to skip the need for array copy. Revision Changes Path 1.3 +54 -8 jakarta-tomcat-connectors/jni/native/src/network.c Index: network.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/network.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- network.c 5 Feb 2005 12:33:09 -0000 1.2 +++ network.c 13 Apr 2005 13:17:42 -0000 1.3 @@ -173,7 +173,7 @@ } TCN_IMPLEMENT_CALL(jint, Socket, send)(TCN_STDARGS, jlong sock, - jbyteArray buf, jint tosend) + jbyteArray buf, jint offset, jint tosend) { apr_socket_t *s = J2P(sock, apr_socket_t *); apr_size_t nbytes = (*e)->GetArrayLength(e, buf); @@ -188,7 +188,7 @@ bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL); else bytes = (*e)->GetByteArrayElements(e, buf, NULL); - TCN_THROW_IF_ERR(apr_socket_send(s, bytes, &nbytes), nbytes); + TCN_THROW_IF_ERR(apr_socket_send(s, bytes + offset, &nbytes), nbytes); cleanup: if (nb) @@ -198,6 +198,28 @@ return (jint)nbytes; } +TCN_IMPLEMENT_CALL(jint, Socket, sendb)(TCN_STDARGS, jlong sock, + jobject buf, jint offset, jint len) +{ + apr_socket_t *s = J2P(sock, apr_socket_t *); + apr_size_t nbytes; + char *bytes; + + UNREFERENCED(o); + bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); + nbytes = (apr_size_t)(*e)->GetDirectBufferCapacity(e, buf); + if (bytes == NULL || nbytes < 0) { + tcn_ThrowAPRException(e, APR_EGENERAL); + goto cleanup; + } + if (len > 0) + nbytes = min(nbytes, (apr_size_t)len); + TCN_THROW_IF_ERR(apr_socket_send(s, bytes + offset, &nbytes), nbytes); + +cleanup: + return (jint)nbytes; +} + TCN_IMPLEMENT_CALL(jint, Socket, sendv)(TCN_STDARGS, jlong sock, jobjectArray bufs) { @@ -231,7 +253,7 @@ TCN_IMPLEMENT_CALL(jint, Socket, sendto)(TCN_STDARGS, jlong sock, jlong where, jint flag, - jbyteArray buf, jint tosend) + jbyteArray buf, jint offset, jint tosend) { apr_socket_t *s = J2P(sock, apr_socket_t *); apr_sockaddr_t *w = J2P(where, apr_sockaddr_t *); @@ -247,7 +269,7 @@ bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL); else bytes = (*e)->GetByteArrayElements(e, buf, NULL); - TCN_THROW_IF_ERR(apr_socket_sendto(s, w, flag, bytes, &nbytes), nbytes); + TCN_THROW_IF_ERR(apr_socket_sendto(s, w, flag, bytes + offset, &nbytes), nbytes); cleanup: if (nb) @@ -258,7 +280,7 @@ } TCN_IMPLEMENT_CALL(jint, Socket, recv)(TCN_STDARGS, jlong sock, - jbyteArray buf, jint toread) + jbyteArray buf, jint offset, jint toread) { apr_socket_t *s = J2P(sock, apr_socket_t *); apr_size_t nbytes = (*e)->GetArrayLength(e, buf); @@ -268,7 +290,7 @@ if (toread > 0) nbytes = min(nbytes, (apr_size_t)toread); - TCN_THROW_IF_ERR(apr_socket_recv(s, bytes, &nbytes), nbytes); + TCN_THROW_IF_ERR(apr_socket_recv(s, bytes + offset, &nbytes), nbytes); cleanup: (*e)->ReleaseByteArrayElements(e, buf, bytes, @@ -276,9 +298,33 @@ return (jint)nbytes; } +TCN_IMPLEMENT_CALL(jint, Socket, recvb)(TCN_STDARGS, jlong sock, + jobject buf, jint offset, jint len) +{ + apr_socket_t *s = J2P(sock, apr_socket_t *); + + apr_size_t nbytes; + char *bytes; + + UNREFERENCED(o); + bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); + nbytes = (apr_size_t)(*e)->GetDirectBufferCapacity(e, buf); + if (bytes == NULL || nbytes < 0) { + tcn_ThrowAPRException(e, APR_EGENERAL); + goto cleanup; + } + if (len > 0) + nbytes = min(nbytes, (apr_size_t)len); + + TCN_THROW_IF_ERR(apr_socket_recv(s, bytes + offset, &nbytes), nbytes); + +cleanup: + return (jint)nbytes; +} + TCN_IMPLEMENT_CALL(jint, Socket, recvfrom)(TCN_STDARGS, jlong from, jlong sock, jint flags, - jbyteArray buf, jint toread) + jbyteArray buf, jint offset, jint toread) { apr_socket_t *s = J2P(sock, apr_socket_t *); apr_sockaddr_t *f = J2P(from, apr_sockaddr_t *); @@ -290,7 +336,7 @@ nbytes = min(nbytes, (apr_size_t)toread); TCN_THROW_IF_ERR(apr_socket_recvfrom(f, s, - (apr_int32_t)flags, bytes, &nbytes), nbytes); + (apr_int32_t)flags, bytes + offset, &nbytes), nbytes); cleanup: (*e)->ReleaseByteArrayElements(e, buf, bytes, 1.3 +1 -2 jakarta-tomcat-connectors/jni/native/src/poll.c Index: poll.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/poll.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- poll.c 5 Feb 2005 12:32:36 -0000 1.2 +++ poll.c 13 Apr 2005 13:17:42 -0000 1.3 @@ -46,7 +46,7 @@ TCN_IMPLEMENT_CALL(jint, Poll, add)(TCN_STDARGS, jlong pollset, jlong socket, jlong data, - jint reqevents, jint rtnevents) + jint reqevents) { apr_pollset_t *p = J2P(pollset, apr_pollset_t *); apr_pollfd_t fd; @@ -56,7 +56,6 @@ memset(&fd, 0, sizeof(apr_pollfd_t)); fd.desc_type = APR_POLL_SOCKET; fd.reqevents = (apr_int16_t)reqevents; - fd.rtnevents = (apr_int16_t)rtnevents; fd.desc.s = J2P(socket, apr_socket_t *); fd.client_data = J2P(data, void *);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]