mturk       2004/08/05 22:42:14

  Modified:    ajp/proxy proxy_util.c mod_proxy.h
  Log:
  Added close_on_recycle flags for creatin connections.
  This flag enables to distinguish between connection types.
  Also added a pool cleanup bound to connection pool that recycles
  the connection when client disconnects from server.
  
  Revision  Changes    Path
  1.18      +36 -1     jakarta-tomcat-connectors/ajp/proxy/proxy_util.c
  
  Index: proxy_util.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/proxy_util.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- proxy_util.c      5 Aug 2004 19:09:13 -0000       1.17
  +++ proxy_util.c      6 Aug 2004 05:42:14 -0000       1.18
  @@ -1324,6 +1324,22 @@
       return APR_SUCCESS;
   }
   
  +static apr_status_t connection_cleanup(void *theconn)
  +{
  +    proxy_conn_rec *conn = (proxy_conn_rec *)theconn;
  +    /* deterimine if the connection need to be closed */
  +    if (conn->close_on_recycle) {
  +        if (conn->sock)
  +            apr_socket_close(conn->sock);
  +        conn->sock = NULL;
  +
  +    }
  +    conn->connection = NULL;
  +    ap_proxy_release_connection(NULL, conn, NULL);
  +    /* Allways return the SUCCESS */
  +    return APR_SUCCESS;
  +}
  +
   /* reslist constructor */
   static apr_status_t connection_constructor(void **resource, void *params,
                                              apr_pool_t *pool)
  @@ -1446,6 +1462,17 @@
            * for now make a core dump.
            */
       }
  +    
  +    /* Need to close the connection */
  +    if (conn->sock && conn->close) {
  +        apr_socket_close(conn->sock);
  +        conn->sock = NULL;
  +    }
  +    conn->close = 0;
  +    /* If there is a connection kill it's cleanup */
  +    if (conn->connection)
  +        apr_pool_cleanup_kill(conn->connection->pool, conn, connection_cleanup);
  +
   #if APR_HAS_THREADS
       if (worker->hmax) {
           rv = apr_reslist_release(worker->cp->res, (void *)conn);
  @@ -1455,7 +1482,7 @@
       {
           worker->cp->conn = conn;
       }
  -    if (rv != APR_SUCCESS) {
  +    if (rv != APR_SUCCESS && proxy_function) {
           ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
                        "proxy: %s: failed to acquire connection for (%s)",
                        proxy_function, conn->hostname);
  @@ -1664,6 +1691,7 @@
   
   PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function,
                                                 proxy_conn_rec *conn,
  +                                              int close_on_recycle,
                                                 conn_rec *c,
                                                 server_rec *s)
   {
  @@ -1705,6 +1733,7 @@
           /* TODO: See if this will break FTP */
           ap_proxy_ssl_disable(conn->connection);
       }
  +    conn->close_on_recycle = close_on_recycle;
   
       ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
                    "proxy: %s: connection complete to %pI (%s)",
  @@ -1712,6 +1741,12 @@
   
       /* set up the connection filters */
       ap_run_pre_connection(conn->connection, conn->sock);
  +
  +    /* register the connection cleanup to client connection
  +     * so that the connection can be closed or reused
  +     */
  +    apr_pool_cleanup_register(c->pool, (void *)conn, connection_cleanup,
  +                              apr_pool_cleanup_null);      
   
       return OK;
   }
  
  
  
  1.24      +2 -1      jakarta-tomcat-connectors/ajp/proxy/mod_proxy.h
  
  Index: mod_proxy.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/mod_proxy.h,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- mod_proxy.h       5 Aug 2004 19:09:13 -0000       1.23
  +++ mod_proxy.h       6 Aug 2004 05:42:14 -0000       1.24
  @@ -192,6 +192,7 @@
       apr_socket_t *sock;     /* Connection socket */
       apr_uint32_t flags;     /* Conection flags */
       int          close;     /* Close 'this' connection */
  +    int          close_on_recycle; /* Close the connection when returning to pool */
       proxy_worker *worker;   /* Connection pool this connection belogns to */
       void         *data;     /* per scheme connection data */
   } proxy_conn_rec;
  @@ -364,7 +365,7 @@
   PROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function, 
proxy_conn_rec *conn, server_rec *s);
   PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn);
   PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, 
proxy_conn_rec *conn, proxy_worker *worker, server_rec *s);
  -PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, 
proxy_conn_rec *conn, conn_rec *c, server_rec *s);
  +PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, 
proxy_conn_rec *conn, int close_on_recycle, conn_rec *c, server_rec *s);
   
   /* For proxy_util */
   extern module PROXY_DECLARE_DATA proxy_module;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to