mturk 2005/06/18 01:03:21 Modified: jni/examples/org/apache/tomcat/jni Echo.java SSLServer.java jni/java/org/apache/tomcat/jni Poll.java SSLSocket.java Socket.java jni/native/include tcn.h jni/native/src network.c poll.c util/java/org/apache/tomcat/util/net AprEndpoint.java Log: Use auto pool management for Socket.accept. On each accept the socket's child pool is created and assigned to the accepted socket. Revision Changes Path 1.14 +2 -2 jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/Echo.java Index: Echo.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/Echo.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- Echo.java 17 Jun 2005 12:03:51 -0000 1.13 +++ Echo.java 18 Jun 2005 08:03:21 -0000 1.14 @@ -99,7 +99,7 @@ int i = 0; try { while (true) { - long clientSock = Socket.accept(serverSock, pool); + long clientSock = Socket.accept(serverSock); System.out.println("Accepted id: " + i); try { 1.10 +3 -3 jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/SSLServer.java Index: SSLServer.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/SSLServer.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SSLServer.java 17 Jun 2005 12:03:51 -0000 1.9 +++ SSLServer.java 18 Jun 2005 08:03:21 -0000 1.10 @@ -116,7 +116,7 @@ int i = 0; try { while (true) { - long clientSock = Socket.accept(serverSock, pool); + long clientSock = Socket.accept(serverSock); System.out.println("Accepted id: " + i); try { @@ -142,7 +142,7 @@ } Socket.timeoutSet(clientSock, 10000000); - SSLSocket.attach(SSLServer.serverCtx, clientSock, pool); + SSLSocket.attach(SSLServer.serverCtx, clientSock); i = SSLSocket.handshake(clientSock); if (i == 0) { 1.13 +3 -4 jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Poll.java Index: Poll.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Poll.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- Poll.java 17 Jun 2005 11:22:04 -0000 1.12 +++ Poll.java 18 Jun 2005 08:03:21 -0000 1.13 @@ -113,11 +113,10 @@ * Maintain on the descriptor(s) in a pollset * @param pollset The pollset to use * @param descriptors Array of signalled descriptors (output parameter) - * The desctiptor array must be two times the size of pollset. + * The desctiptor array must be the size of pollset. * and are populated as follows: * <PRE> - * descriptors[n + 0] -> returned events - * descriptors[n + 1] -> socket + * descriptors[n] -> socket * </PRE> * @param remove Remove signaled descriptors from pollset * @return Number of signalled descriptors (output parameter) 1.15 +3 -5 jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLSocket.java Index: SSLSocket.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLSocket.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- SSLSocket.java 17 Jun 2005 12:04:40 -0000 1.14 +++ SSLSocket.java 18 Jun 2005 08:03:21 -0000 1.15 @@ -30,12 +30,10 @@ /** * Attach APR socket on a SSL connection. * @param ctx SSLContext to use. - * @param sock APR Socket that already did physical connect. - * @param pool The pool to use - * @param pool The pool to use + * @param sock APR Socket that already did physical connect or accept. * @return APR_STATUS code. */ - public static native int attach(long ctx, long sock, long pool) + public static native int attach(long ctx, long sock) throws Exception; /** 1.17 +3 -3 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.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- Socket.java 17 Jun 2005 09:41:30 -0000 1.16 +++ Socket.java 18 Jun 2005 08:03:21 -0000 1.17 @@ -102,7 +102,7 @@ * @param family The address family of the socket (e.g., APR_INET). * @param type The type of the socket (e.g., SOCK_STREAM). * @param protocol The protocol of the socket (e.g., APR_PROTO_TCP). - * @param cont The pool to use + * @param cont The parent pool to use * @return The new socket that has been set up. */ public static native long create(int family, int type, @@ -163,7 +163,7 @@ * made the connection request. This is the socket which should * be used for all future communication. */ - public static native long accept(long sock, long pool) + public static native long accept(long sock) throws Exception; /** 1.22 +6 -6 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.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- tcn.h 17 Jun 2005 14:17:00 -0000 1.21 +++ tcn.h 18 Jun 2005 08:03:21 -0000 1.22 @@ -118,11 +118,11 @@ void *opaque; int type; 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); + apr_status_t (APR_THREAD_FUNC *send) (void *, const char *, apr_size_t *); + apr_status_t (APR_THREAD_FUNC *sendv)(void *, const struct iovec *, apr_int32_t, apr_size_t *); + apr_status_t (APR_THREAD_FUNC *recv) (void *, char *, apr_size_t *); + apr_status_t (APR_THREAD_FUNC *close) (void *); + apr_status_t (APR_THREAD_FUNC *shutdown) (void *, apr_shutdown_how_e); } tcn_socket_t; 1.30 +104 -33 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.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- network.c 17 Jun 2005 14:17:00 -0000 1.29 +++ network.c 18 Jun 2005 08:03:21 -0000 1.30 @@ -150,7 +150,7 @@ static apr_status_t sp_socket_cleanup(void *data) { tcn_socket_t *s = (tcn_socket_t *)data; - + if (s->cleanup) { (*s->cleanup)(s->opaque); s->cleanup = NULL; @@ -165,9 +165,42 @@ return APR_SUCCESS; } +#if defined(DEBUG) || defined(_DEBUG) +static APR_INLINE apr_status_t APR_THREAD_FUNC +APR_socket_send(void *sock, const char *buf, apr_size_t *len) +{ + return apr_socket_send((apr_socket_t *)sock, buf, len); +} + +static APR_INLINE apr_status_t APR_THREAD_FUNC +APR_socket_recv(void *sock, char *buf, apr_size_t *len) +{ + return apr_socket_recv((apr_socket_t *)sock, buf, len); +} + +static APR_INLINE apr_status_t APR_THREAD_FUNC +APR_socket_sendv(void *sock, const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len) +{ + return apr_socket_sendv((apr_socket_t *)sock, vec, nvec, len); +} + +static APR_INLINE apr_status_t APR_THREAD_FUNC +APR_socket_shutdown(void *sock, apr_shutdown_how_e how) +{ + return apr_socket_shutdown((apr_socket_t *)sock, how); +} + +#else +#define APR_socket_send apr_socket_send +#define APR_socket_recv apr_socket_recv +#define APR_socket_sendv apr_socket_sendv +#define APR_socket_shutdown apr_socket_shutdown +#endif TCN_IMPLEMENT_CALL(jlong, Socket, create)(TCN_STDARGS, jint family, - jint type, jint protocol, jlong pool) + jint type, jint protocol, + jlong pool) { apr_pool_t *p = J2P(pool, apr_pool_t *); apr_socket_t *s = NULL; @@ -180,7 +213,7 @@ GET_S_TYPE(t, type); TCN_THROW_IF_ERR(apr_socket_create(&s, - f, t, protocol, p), s); + f, t, protocol, p), a); #ifdef TCN_DO_STATISTICS sp_created++; @@ -189,12 +222,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; + a->recv = APR_socket_recv; + a->send = APR_socket_send; + a->sendv = APR_socket_sendv; + a->shutdown = APR_socket_shutdown; + a->close = NULL; + a->opaque = s; apr_pool_cleanup_register(p, (const void *)a, sp_socket_cleanup, apr_pool_cleanup_null); @@ -229,7 +262,7 @@ UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); - return (jint)(*s->net_shutdown)(s->opaque, how); + return (jint)(*s->shutdown)(s->opaque, how); } TCN_IMPLEMENT_CALL(jint, Socket, close)(TCN_STDARGS, jlong sock) @@ -242,8 +275,8 @@ #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&sp_closed); #endif - if (s->net_close) - rv = (*s->net_close)(s->opaque); + if (s->close) + rv = (*s->close)(s->opaque); if (s->sock) { rv = (jint)apr_socket_close(s->sock); s->sock = NULL; @@ -272,8 +305,8 @@ return (jint)apr_socket_listen(s->sock, backlog); } -TCN_IMPLEMENT_CALL(jlong, Socket, accept)(TCN_STDARGS, jlong sock, - jlong pool) +TCN_IMPLEMENT_CALL(jlong, Socket, acceptx)(TCN_STDARGS, jlong sock, + jlong pool) { tcn_socket_t *s = J2P(sock, tcn_socket_t *); apr_pool_t *p = J2P(pool, apr_pool_t *); @@ -293,12 +326,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; + a->recv = APR_socket_recv; + a->send = APR_socket_send; + a->sendv = APR_socket_sendv; + a->shutdown = APR_socket_shutdown; + a->close = NULL; + a->opaque = n; apr_pool_cleanup_register(p, (const void *)a, sp_socket_cleanup, apr_pool_cleanup_null); @@ -308,6 +341,44 @@ return P2J(a); } +TCN_IMPLEMENT_CALL(jlong, Socket, accept)(TCN_STDARGS, jlong sock) +{ + tcn_socket_t *s = J2P(sock, tcn_socket_t *); + apr_pool_t *p = NULL; + apr_socket_t *n = NULL; + tcn_socket_t *a = NULL; + + UNREFERENCED(o); + TCN_ASSERT(sock != 0); + + TCN_THROW_IF_ERR(apr_pool_create(&p, s->pool), p); + TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n); + + if (n) { +#ifdef TCN_DO_STATISTICS + apr_atomic_inc32(&sp_accepted); +#endif + a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t)); + a->sock = n; + a->pool = p; + a->type = TCN_SOCKET_APR; + a->recv = APR_socket_recv; + a->send = APR_socket_send; + a->sendv = APR_socket_sendv; + a->shutdown = APR_socket_shutdown; + a->close = NULL; + a->opaque = n; + apr_pool_cleanup_register(p, (const void *)a, + sp_socket_cleanup, + apr_pool_cleanup_null); + } + else if (p) + apr_pool_destroy(p); + +cleanup: + return P2J(a); +} + TCN_IMPLEMENT_CALL(jint, Socket, connect)(TCN_STDARGS, jlong sock, jlong sa) { @@ -328,7 +399,7 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); - + if (tosend <= TCN_BUFFER_SZ) { char sb[TCN_BUFFER_SZ]; (*e)->GetByteArrayRegion(e, buf, offset, tosend, (jbyte *)sb); @@ -342,7 +413,7 @@ bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL); else bytes = (*e)->GetByteArrayElements(e, buf, NULL); - ss = (*s->net_send)(s->opaque, bytes + offset, &nbytes); + ss = (*s->send)(s->opaque, bytes + offset, &nbytes); if (nb) (*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT); else @@ -369,7 +440,7 @@ TCN_ASSERT(buf != NULL); bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); - ss = (*s->net_send)(s->opaque, bytes + offset, &nbytes); + ss = (*s->send)(s->opaque, bytes + offset, &nbytes); if (ss == APR_SUCCESS) return (jint)nbytes; @@ -403,7 +474,7 @@ vec[i].iov_base = (*e)->GetByteArrayElements(e, ba[i], NULL); } - ss = (*s->net_sendv)(s->opaque, vec, nvec, &written); + ss = (*s->sendv)(s->opaque, vec, nvec, &written); for (i = 0; i < nvec; i++) { (*e)->ReleaseByteArrayElements(e, ba[i], vec[i].iov_base, JNI_ABORT); @@ -463,13 +534,13 @@ if (toread <= TCN_BUFFER_SZ) { char sb[TCN_BUFFER_SZ]; - - if ((ss = (*s->net_recv)(s->opaque, sb, &nbytes)) == APR_SUCCESS) + + if ((ss = (*s->recv)(s->opaque, sb, &nbytes)) == APR_SUCCESS) (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb); } else { jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); - ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes); + ss = (*s->recv)(s->opaque, bytes + offset, &nbytes); (*e)->ReleaseByteArrayElements(e, buf, bytes, nbytes ? 0 : JNI_ABORT); } @@ -500,12 +571,12 @@ goto cleanup; if (toread <= TCN_BUFFER_SZ) { char sb[TCN_BUFFER_SZ]; - ss = (*s->net_recv)(s->opaque, sb, &nbytes); + ss = (*s->recv)(s->opaque, sb, &nbytes); (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb); } else { jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); - ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes); + ss = (*s->recv)(s->opaque, bytes + offset, &nbytes); (*e)->ReleaseByteArrayElements(e, buf, bytes, nbytes ? 0 : JNI_ABORT); } @@ -534,7 +605,7 @@ bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); TCN_ASSERT(bytes != NULL); - ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes); + ss = (*s->recv)(s->opaque, bytes + offset, &nbytes); if (ss == APR_SUCCESS) return (jint)nbytes; @@ -565,7 +636,7 @@ return -(jint)ss; if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS) return -(jint)ss; - ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes); + ss = (*s->recv)(s->opaque, bytes + offset, &nbytes); /* Resore the original timeout */ apr_socket_timeout_set(s->sock, t); @@ -686,7 +757,7 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); TCN_ASSERT(file != 0); - + if (s->type != TCN_SOCKET_APR) return (jint)(-APR_ENOTIMPL); if (headers) 1.22 +3 -6 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.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- poll.c 17 Jun 2005 09:41:30 -0000 1.21 +++ poll.c 18 Jun 2005 08:03:21 -0000 1.22 @@ -292,11 +292,8 @@ if (p->max_ttl > 0) { for (i = 0; i < p->nelts; i++) { if ((now - p->socket_ttl[i]) > p->max_ttl) { - p->socket_set[i].rtnevents = APR_POLLHUP | APR_POLLIN; fd = p->socket_set[i]; - pset[num*2+0] = (jlong)(fd.rtnevents); - pset[num*2+1] = P2J(fd.client_data); - num++; + pset[num++] = P2J(fd.client_data); } } if (remove && num) { @@ -307,7 +304,7 @@ #endif for (i = 0; i < num; i++) { fd.desc_type = APR_POLL_SOCKET; - fd.desc.s = (J2P(pset[i*2+1], tcn_socket_t *))->sock; + fd.desc.s = (J2P(pset[i], tcn_socket_t *))->sock; do_remove(p, &fd); } } 1.48 +2 -5 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java Index: AprEndpoint.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java,v retrieving revision 1.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- AprEndpoint.java 17 Jun 2005 12:31:40 -0000 1.47 +++ AprEndpoint.java 18 Jun 2005 08:03:21 -0000 1.48 @@ -722,11 +722,8 @@ Worker workerThread = getWorkerThread(); // Accept the next incoming connection from the server socket - long socket = 0; - long pool = 0; try { - pool = Pool.create(serverSockPool); - socket = Socket.accept(serverSock, pool); + long socket = Socket.accept(serverSock); // Hand this socket off to an appropriate processor workerThread.assign(socket); } catch (Exception e) { @@ -916,7 +913,7 @@ keepAliveCount -= rv; for (int n = 0; n < rv; n++) { // Close socket and clear pool - Socket.destroy(desc[n*2+1]); + Socket.destroy(desc[n]); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]