mturk 2005/04/15 03:26:19 Modified: jni/java/org/apache/tomcat/jni Socket.java jni/native/src network.c Log: Added timeout reads for recv and recvb. Revision Changes Path 1.6 +48 -1 jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Socket.java Index: Socket.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Socket.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- Socket.java 14 Apr 2005 16:41:08 -0000 1.5 +++ Socket.java 15 Apr 2005 10:26:19 -0000 1.6 @@ -264,6 +264,30 @@ public static native int recv(long sock, byte[] buf, int offset, int nbytes); /** + * Read data from a network with timeout. + * + * <PRE> + * This functions acts like a blocking read by default. To change + * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK + * socket option. + * The number of bytes actually received is stored in argument 3. + * + * It is possible for both bytes to be received and an APR_EOF or + * other error to be returned. + * + * APR_EINTR is never returned. + * </PRE> + * @param sock The socket to read the data from. + * @param buf The buffer to store the data in. + * @param offset Offset in the byte buffer. + * @param nbytes The number of bytes to read (-1) for full array. + * @param timeout The socket timeout in microseconds. + * @return the number of bytes received. + */ + public static native int recvt(long sock, byte[] buf, int offset, + int nbytes, long timeout); + + /** * Read data from a network. * * <PRE> @@ -286,6 +310,29 @@ public static native int recvb(long sock, ByteBuffer buf, int offset, int nbytes); + /** + * Read data from a network with timeout. + * + * <PRE> + * This functions acts like a blocking read by default. To change + * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK + * socket option. + * The number of bytes actually received is stored in argument 3. + * + * It is possible for both bytes to be received and an APR_EOF or + * other error to be returned. + * + * APR_EINTR is never returned. + * </PRE> + * @param sock The socket to read the data from. + * @param buf The buffer to store the data in. + * @param offset Offset in the byte buffer. + * @param nbytes The number of bytes to read (-1) for full array. + * @param timeout The socket timeout in microseconds. + * @return the number of bytes received. + */ + public static native int recvbt(long sock, ByteBuffer buf, + int offset, int nbytes, long timeout); /** * @param from The apr_sockaddr_t to fill in the recipient info 1.6 +64 -0 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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- network.c 14 Apr 2005 16:41:24 -0000 1.5 +++ network.c 15 Apr 2005 10:26:19 -0000 1.6 @@ -313,6 +313,36 @@ return -(jint)ss; } +TCN_IMPLEMENT_CALL(jint, Socket, recvt)(TCN_STDARGS, jlong sock, + jbyteArray buf, jint offset, + jint toread, jlong timeout) +{ + apr_socket_t *s = J2P(sock, apr_socket_t *); + apr_size_t nbytes = (*e)->GetArrayLength(e, buf); + jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); + apr_status_t ss; + apr_interval_time_t t; + + UNREFERENCED(o); + + if (toread > 0) + nbytes = min(nbytes - offset, (apr_size_t)toread); + if ((ss = apr_socket_timeout_get(s, &t)) != APR_SUCCESS) + goto cleanup; + if ((ss = apr_socket_timeout_set(s, J2T(timeout))) != APR_SUCCESS) + goto cleanup; + ss = apr_socket_recv(s, bytes + offset, &nbytes); + /* Resore the original timeout */ + apr_socket_timeout_set(s, t); +cleanup: + (*e)->ReleaseByteArrayElements(e, buf, bytes, + nbytes ? 0 : JNI_ABORT); + if (ss == APR_SUCCESS) + return (jint)nbytes; + else + return -(jint)ss; +} + TCN_IMPLEMENT_CALL(jint, Socket, recvb)(TCN_STDARGS, jlong sock, jobject buf, jint offset, jint len) { @@ -339,6 +369,40 @@ return -(jint)ss; } +TCN_IMPLEMENT_CALL(jint, Socket, recvbt)(TCN_STDARGS, jlong sock, + jobject buf, jint offset, + jint len, jlong timeout) +{ + apr_socket_t *s = J2P(sock, apr_socket_t *); + apr_status_t ss; + apr_size_t nbytes; + char *bytes; + apr_interval_time_t t; + + 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); + return (jint)(-APR_EGENERAL); + } + if (len > 0) + nbytes = min(nbytes - offset, (apr_size_t)len); + + if ((ss = apr_socket_timeout_get(s, &t)) != APR_SUCCESS) + return -(jint)ss; + if ((ss = apr_socket_timeout_set(s, J2T(timeout))) != APR_SUCCESS) + return -(jint)ss; + ss = apr_socket_recv(s, bytes + offset, &nbytes); + /* Resore the original timeout */ + apr_socket_timeout_set(s, t); + + if (ss == APR_SUCCESS) + return (jint)nbytes; + else + return -(jint)ss; +} + TCN_IMPLEMENT_CALL(jint, Socket, recvfrom)(TCN_STDARGS, jlong from, jlong sock, jint flags, jbyteArray buf, jint offset, jint toread)
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]