mturk 2005/06/17 07:17:00 Modified: jni/native/include tcn.h jni/native/src network.c sslnetwork.c Log: Instead duplicating entire Socket API, duplicate APR API. Revision Changes Path 1.21 +12 -16 jakarta-tomcat-connectors/jni/native/include/tcn.h Index: tcn.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/include/tcn.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- tcn.h 17 Jun 2005 11:22:30 -0000 1.20 +++ tcn.h 17 Jun 2005 14:17:00 -0000 1.21 @@ -45,7 +45,7 @@ #include <process.h> #else #include <unistd.h> -#endif +#endif #include <jni.h> #if defined(_DEBUG) || defined(DEBUG) @@ -107,26 +107,22 @@ #define TCN_GETNET_METHOD(FN) method_##FN -#define TCN_SOCKET_APR 1 -#define TCN_SOCKET_SSL 2 -#define TCN_SOCKET_UNIX 4 -#define TCN_SOCKET_NTPIPE 5 +#define TCN_SOCKET_APR 0 +#define TCN_SOCKET_SSL 1 +#define TCN_SOCKET_UNIX 2 +#define TCN_SOCKET_NTPIPE 3 typedef struct { apr_pool_t *pool; apr_socket_t *sock; void *opaque; int type; - apr_status_t (*cleanup)(void *opaque); - jint (*shutdown)(TCN_IMPARGS, jint how); - jint (*close)(TCN_IMPARGS); - jint (*send)(TCN_IMPARGS, jbyteArray buf, jint offset, jint tosend); - jint (*sendb)(TCN_IMPARGS, jobject buf, jint offset, jint len); - jint (*sendv)(TCN_IMPARGS, jobjectArray bufs); - jint (*recv)(TCN_IMPARGS, jbyteArray buf, jint offset, jint toread); - jint (*recvt)(TCN_IMPARGS, jbyteArray buf, jint offset, jint toread, jlong timeout); - jint (*recvb)(TCN_IMPARGS, jobject buf, jint offset, jint len); - jint (*recvbt)(TCN_IMPARGS, jobject buf, jint offset, jint len, jlong timeout); + apr_status_t (*cleanup)(void *); + apr_status_t (APR_THREAD_FUNC *net_send) (void *, const char *, apr_size_t *); + apr_status_t (APR_THREAD_FUNC *net_sendv)(void *sock, const struct iovec *, apr_int32_t, apr_size_t *); + apr_status_t (APR_THREAD_FUNC *net_recv) (void *sock, char *, apr_size_t *); + apr_status_t (APR_THREAD_FUNC *net_close) (void *); + apr_status_t (APR_THREAD_FUNC *net_shutdown) (void *, apr_shutdown_how_e); } tcn_socket_t; 1.29 +27 -34 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.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- network.c 17 Jun 2005 11:22:30 -0000 1.28 +++ network.c 17 Jun 2005 14:17:00 -0000 1.29 @@ -189,6 +189,12 @@ a->sock = s; a->pool = p; a->type = TCN_SOCKET_APR; + a->net_recv = apr_socket_recv; + a->net_send = apr_socket_send; + a->net_sendv = apr_socket_sendv; + a->net_shutdown = apr_socket_shutdown; + a->net_close = NULL; + a->opaque = s; apr_pool_cleanup_register(p, (const void *)a, sp_socket_cleanup, apr_pool_cleanup_null); @@ -223,10 +229,7 @@ UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); - if (s->shutdown) - return (*s->shutdown)(TCN_IMPCALL(s), how); - else - return (jint)apr_socket_shutdown(s->sock, (apr_shutdown_how_e)how); + return (jint)(*s->net_shutdown)(s->opaque, how); } TCN_IMPLEMENT_CALL(jint, Socket, close)(TCN_STDARGS, jlong sock) @@ -239,9 +242,9 @@ #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&sp_closed); #endif - if (s->close) - rv = (*s->close)(TCN_IMPCALL(s)); - if (s->sock) { + if (s->net_close) + rv = (*s->net_close)(s->opaque); + if (s->sock) { rv = (jint)apr_socket_close(s->sock); s->sock = NULL; } @@ -290,6 +293,12 @@ a->sock = n; a->pool = p; a->type = TCN_SOCKET_APR; + a->net_recv = apr_socket_recv; + a->net_send = apr_socket_send; + a->net_sendv = apr_socket_sendv; + a->net_shutdown = apr_socket_shutdown; + a->net_close = NULL; + a->opaque = n; apr_pool_cleanup_register(p, (const void *)a, sp_socket_cleanup, apr_pool_cleanup_null); @@ -320,8 +329,6 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); - if (s->send) - return (*s->send)(TCN_IMPCALL(s), buf, offset, tosend); if (tosend <= TCN_BUFFER_SZ) { char sb[TCN_BUFFER_SZ]; (*e)->GetByteArrayRegion(e, buf, offset, tosend, (jbyte *)sb); @@ -335,8 +342,7 @@ bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL); else bytes = (*e)->GetByteArrayElements(e, buf, NULL); - ss = apr_socket_send(s->sock, bytes + offset, &nbytes); - + ss = (*s->net_send)(s->opaque, bytes + offset, &nbytes); if (nb) (*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT); else @@ -361,11 +367,9 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); TCN_ASSERT(buf != NULL); - if (s->sendb) - return (*s->sendb)(TCN_IMPCALL(s), buf, offset, len); bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); - ss = apr_socket_send(s->sock, bytes + offset, &nbytes); + ss = (*s->net_send)(s->opaque, bytes + offset, &nbytes); if (ss == APR_SUCCESS) return (jint)nbytes; @@ -389,8 +393,6 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); - if (s->sendv) - return (*s->sendv)(TCN_IMPCALL(s), bufs); nvec = (*e)->GetArrayLength(e, bufs); if (nvec >= APR_MAX_IOVEC_SIZE) return (jint)(-APR_ENOMEM); @@ -401,7 +403,7 @@ vec[i].iov_base = (*e)->GetByteArrayElements(e, ba[i], NULL); } - ss = apr_socket_sendv(s->sock, vec, nvec, &written); + ss = (*s->net_sendv)(s->opaque, vec, nvec, &written); for (i = 0; i < nvec; i++) { (*e)->ReleaseByteArrayElements(e, ba[i], vec[i].iov_base, JNI_ABORT); @@ -459,17 +461,15 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); - if (s->recv) - return (*s->recv)(TCN_IMPCALL(s), buf, offset, toread); - if (toread <= TCN_BUFFER_SZ) { char sb[TCN_BUFFER_SZ]; - if ((ss = apr_socket_recv(s->sock, sb, &nbytes)) == APR_SUCCESS) + + if ((ss = (*s->net_recv)(s->opaque, sb, &nbytes)) == APR_SUCCESS) (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb); } else { jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); - ss = apr_socket_recv(s->sock, bytes + offset, &nbytes); + ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes); (*e)->ReleaseByteArrayElements(e, buf, bytes, nbytes ? 0 : JNI_ABORT); } @@ -494,20 +494,18 @@ TCN_ASSERT(sock != 0); TCN_ASSERT(buf != NULL); - if (s->recvt) - return (*s->recvt)(TCN_IMPCALL(s), buf, offset, toread, timeout); if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS) goto cleanup; if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS) goto cleanup; if (toread <= TCN_BUFFER_SZ) { char sb[TCN_BUFFER_SZ]; - ss = apr_socket_recv(s->sock, sb, &nbytes); + ss = (*s->net_recv)(s->opaque, sb, &nbytes); (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb); } else { jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); - ss = apr_socket_recv(s->sock, bytes + offset, &nbytes); + ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes); (*e)->ReleaseByteArrayElements(e, buf, bytes, nbytes ? 0 : JNI_ABORT); } @@ -533,12 +531,10 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); TCN_ASSERT(buf != NULL); - if (s->recvb) - return (*s->recvb)(TCN_IMPCALL(s), buf, offset, len); bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); TCN_ASSERT(bytes != NULL); - ss = apr_socket_recv(s->sock, bytes + offset, &nbytes); + ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes); if (ss == APR_SUCCESS) return (jint)nbytes; @@ -562,9 +558,6 @@ TCN_ASSERT(sock != 0); TCN_ASSERT(buf != NULL); - if (s->recvbt) - return (*s->recvbt)(TCN_IMPCALL(s), buf, offset, len, timeout); - bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); TCN_ASSERT(bytes != NULL); @@ -572,7 +565,7 @@ return -(jint)ss; if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS) return -(jint)ss; - ss = apr_socket_recv(s->sock, bytes + offset, &nbytes); + ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes); /* Resore the original timeout */ apr_socket_timeout_set(s->sock, t); 1.15 +38 -222 jakarta-tomcat-connectors/jni/native/src/sslnetwork.c Index: sslnetwork.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslnetwork.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- sslnetwork.c 17 Jun 2005 12:04:40 -0000 1.14 +++ sslnetwork.c 17 Jun 2005 14:17:00 -0000 1.15 @@ -91,7 +91,7 @@ return rc; } -TCN_IMPLEMENT_METHOD(apr_status_t, cleanup)(void *data) +static apr_status_t ssl_cleanup(void *data) { tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)data; @@ -181,7 +181,7 @@ apr_socket_timeout_get(con->sock, &timeout); pfd.desc_type = APR_POLL_SOCKET; - pfd.desc.s = con->sock; + pfd.desc.s = con->sock; pfd.reqevents = type; /* Remove the object if it was in the pollset, then add in the new @@ -205,13 +205,12 @@ return status; } -TCN_IMPLEMENT_METHOD(jint, shutdown)(TCN_IMPARGS, jint how) +static apr_status_t APR_THREAD_FUNC +ssl_socket_shutdown(void *sock, apr_shutdown_how_e how) { apr_status_t rv = APR_SUCCESS; tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock; - UNREFERENCED_STDARGS; - TCN_ASSERT(sock != 0); if (con->ssl) { if (how < 1) how = con->shutdown_type; @@ -220,15 +219,14 @@ SSL_free(con->ssl); con->ssl = NULL; } - return (jint)rv; + return rv; } -TCN_IMPLEMENT_METHOD(jint, close)(TCN_IMPARGS) +static apr_status_t APR_THREAD_FUNC +ssl_socket_close(void *sock) { tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock; apr_status_t rv = APR_SUCCESS; - UNREFERENCED_STDARGS; - TCN_ASSERT(sock != 0); #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&ssl_closed); @@ -242,7 +240,7 @@ X509_free(con->peer); con->peer = NULL; } - return (jint)rv; + return rv; } TCN_IMPLEMENT_CALL(jint, SSLSocket, handshake)(TCN_STDARGS, jlong sock) @@ -310,7 +308,8 @@ return APR_SUCCESS; } -static apr_status_t ssl_socket_recv(tcn_ssl_conn_t *con, char *buf, apr_size_t *len) +static apr_status_t APR_THREAD_FUNC +ssl_socket_recv(tcn_ssl_conn_t *con, char *buf, apr_size_t *len) { int s, rd = (int)(*len); apr_status_t rv = APR_SUCCESS; @@ -355,8 +354,9 @@ return rv; } -static apr_status_t ssl_socket_send(tcn_ssl_conn_t *con, const char *buf, - apr_size_t *len) +static apr_status_t APR_THREAD_FUNC +ssl_socket_send(tcn_ssl_conn_t *con, const char *buf, + apr_size_t *len) { int s, rd = (int)(*len); apr_status_t rv = APR_SUCCESS; @@ -396,207 +396,27 @@ return rv; } -TCN_IMPLEMENT_METHOD(jint, send)(TCN_IMPARGS, - jbyteArray buf, jint offset, - jint tosend) -{ - tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; - apr_size_t nbytes = (apr_size_t)tosend; - jbyte *bytes; - apr_int32_t nb; - apr_status_t ss; - - UNREFERENCED(o); - TCN_ASSERT(sock != 0); - apr_socket_opt_get(s->sock, APR_SO_NONBLOCK, &nb); - if (nb) - bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL); - else - bytes = (*e)->GetByteArrayElements(e, buf, NULL); - ss = ssl_socket_send(s, bytes + offset, &nbytes); - if (nb) - (*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT); - else - (*e)->ReleaseByteArrayElements(e, buf, bytes, JNI_ABORT); - if (ss == APR_SUCCESS) - return (jint)nbytes; - else { - TCN_ERROR_WRAP(ss); - return -(jint)ss; - } -} - -TCN_IMPLEMENT_METHOD(jint, sendv)(TCN_IMPARGS, - jobjectArray bufs) +static apr_status_t APR_THREAD_FUNC +ssl_socket_sendv(tcn_ssl_conn_t *sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len) { - tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; - jsize nvec = (*e)->GetArrayLength(e, bufs); - jsize i; - jobject ba; - apr_size_t written = 0; - apr_status_t ss; - - UNREFERENCED(o); - TCN_ASSERT(sock != 0); + apr_status_t rv; + apr_size_t readed = 0; + apr_int32_t i; - if (nvec >= APR_MAX_IOVEC_SIZE) - return (jint)(-APR_ENOMEM); for (i = 0; i < nvec; i++) { - apr_size_t len; - jbyte *buf; - ba = (*e)->GetObjectArrayElement(e, bufs, i); - len = (*e)->GetArrayLength(e, ba); - buf = (*e)->GetByteArrayElements(e, ba, NULL); - ss = ssl_socket_send(s, buf, &len); - (*e)->ReleaseByteArrayElements(e, ba, buf, JNI_ABORT); - if (ss == APR_SUCCESS) - written += len; - else - break; - } - - if (ss == APR_SUCCESS) - return (jint)written; - else { - TCN_ERROR_WRAP(ss); - return -(jint)ss; - } -} - -TCN_IMPLEMENT_METHOD(jint, sendb)(TCN_IMPARGS, - jobject buf, jint offset, jint len) -{ - tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; - apr_size_t nbytes = (apr_size_t)len; - char *bytes; - apr_status_t ss; - - UNREFERENCED(o); - TCN_ASSERT(sock != 0); - TCN_ASSERT(buf != NULL); - bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); - ss = ssl_socket_send(s, bytes + offset, &nbytes); - - if (ss == APR_SUCCESS) - return (jint)nbytes; - else { - TCN_ERROR_WRAP(ss); - return -(jint)ss; - } -} - - -TCN_IMPLEMENT_METHOD(jint, recv)(TCN_IMPARGS, - jbyteArray buf, jint offset, - jint toread) -{ - tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; - apr_size_t nbytes = (apr_size_t)toread; - jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); - apr_status_t ss; - - UNREFERENCED(o); - TCN_ASSERT(sock != 0); - TCN_ASSERT(bytes != NULL); - ss = ssl_socket_recv(s, bytes + offset, &nbytes); - - (*e)->ReleaseByteArrayElements(e, buf, bytes, - nbytes ? 0 : JNI_ABORT); - if (ss == APR_SUCCESS) - return (jint)nbytes; - else { - TCN_ERROR_WRAP(ss); - return -(jint)ss; - } -} - -TCN_IMPLEMENT_METHOD(jint, recvt)(TCN_IMPARGS, - jbyteArray buf, jint offset, - jint toread, jlong timeout) -{ - tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; - apr_size_t nbytes = (apr_size_t)toread; - jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); - apr_status_t ss; - apr_interval_time_t t; - - UNREFERENCED(o); - TCN_ASSERT(sock != 0); - TCN_ASSERT(buf != NULL); - TCN_ASSERT(bytes != NULL); - - if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS) - goto cleanup; - if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS) - goto cleanup; - ss = ssl_socket_recv(s, bytes + offset, &nbytes); - /* Resore the original timeout */ - apr_socket_timeout_set(s->sock, t); -cleanup: - (*e)->ReleaseByteArrayElements(e, buf, bytes, - nbytes ? 0 : JNI_ABORT); - if (ss == APR_SUCCESS) - return (jint)nbytes; - else { - TCN_ERROR_WRAP(ss); - return -(jint)ss; - } -} - -TCN_IMPLEMENT_METHOD(jint, recvb)(TCN_IMPARGS, - jobject buf, jint offset, jint len) -{ - tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); - apr_status_t ss; - apr_size_t nbytes = (apr_size_t)len; - char *bytes; - - UNREFERENCED(o); - TCN_ASSERT(sock != 0); - TCN_ASSERT(buf != NULL); - bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); - TCN_ASSERT(bytes != NULL); - ss = ssl_socket_recv(s, bytes + offset, &nbytes); - - if (ss == APR_SUCCESS) - return (jint)nbytes; - else { - TCN_ERROR_WRAP(ss); - return -(jint)ss; + apr_size_t rd = vec[i].iov_len; + if ((rv = ssl_socket_send(sock, vec[i].iov_base, &rd)) != APR_SUCCESS) { + *len = readed; + return rv; + } + readed += rd; } + *len = readed; + return APR_SUCCESS; } -TCN_IMPLEMENT_METHOD(jint, recvbt)(TCN_IMPARGS, - jobject buf, jint offset, - jint len, jlong timeout) -{ - tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); - apr_status_t ss; - apr_size_t nbytes = (apr_size_t)len; - char *bytes; - apr_interval_time_t t; - - UNREFERENCED(o); - TCN_ASSERT(sock != 0); - TCN_ASSERT(buf != NULL); - bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); - TCN_ASSERT(bytes != NULL); - - if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS) - return -(jint)ss; - if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS) - return -(jint)ss; - ss = ssl_socket_recv(s, bytes + offset, &nbytes); - /* Resore the original timeout */ - apr_socket_timeout_set(s->sock, t); - - if (ss == APR_SUCCESS) - return (jint)nbytes; - else { - TCN_ERROR_WRAP(ss); - return -(jint)ss; - } -} TCN_IMPLEMENT_CALL(jint, SSLSocket, attach)(TCN_STDARGS, jlong ctx, jlong sock, jlong pool) @@ -625,18 +445,14 @@ else SSL_set_connect_state(con->ssl); /* Change socket type */ - s->type = TCN_SOCKET_SSL; - s->cleanup = TCN_GETNET_METHOD(cleanup); - s->shutdown = TCN_GETNET_METHOD(shutdown); - s->close = TCN_GETNET_METHOD(close); - s->send = TCN_GETNET_METHOD(send); - s->sendb = TCN_GETNET_METHOD(sendb); - s->sendv = TCN_GETNET_METHOD(sendv); - s->recv = TCN_GETNET_METHOD(recv); - s->recvt = TCN_GETNET_METHOD(recvt); - s->recvb = TCN_GETNET_METHOD(recvb); - s->recvbt = TCN_GETNET_METHOD(recvbt); - s->opaque = con; + s->type = TCN_SOCKET_SSL; + s->cleanup = ssl_cleanup; + s->net_recv = ssl_socket_recv; + s->net_send = ssl_socket_send; + s->net_sendv = ssl_socket_sendv; + s->net_shutdown = ssl_socket_shutdown; + s->net_close = ssl_socket_close; + s->opaque = con; return APR_SUCCESS; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]