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]

Reply via email to