Commit 1d7baf4c authored by Jim Jagielski's avatar Jim Jagielski
Browse files

Merge r1833014 from trunk:

* modules/http/http_request.c (ap_process_request_after_handler,
  ap_process_request): Cache and retrieve the brigade structure used
  to send EOR and FLUSH between requests in c->pool userdata, to avoid
  allocating a brigade structure per-request out of c->pool.

Submitted by: rpluem, jorton

Submitted by: jorton
Reviewed by: jorton, covener, jim


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1833841 13f79535-47bb-0310-9956-ffa450edef68
parent cf7bf643
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
                                                         -*- coding: utf-8 -*-
Changes with Apache 2.4.34

  *) http: Fix small memory leak per request when handling persistent
     connections.  [Ruediger Pluem, Joe Orton]

  *) mod_proxy_html: Fix variable interpolation and memory allocation failure
     in ProxyHTMLURLMap.  [Ewald Dieterich <ewald mailbox.org>]

+0 −5
Original line number Diff line number Diff line
@@ -141,11 +141,6 @@ RELEASE SHOWSTOPPERS:
PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
  [ start all new proposals below, under PATCHES PROPOSED. ]

  *) http: Fix small memory leak per request when handling persistent connections
     trunk patch: http://svn.apache.org/r1833014
     2.4.x patch: trunk works (modulo CHANGES)
                  svn merge -c 1833014 ^/httpd/httpd/trunk . 
     +1: jorton, covener, jim

PATCHES PROPOSED TO BACKPORT FROM TRUNK:
  [ New proposals should be added at the end of the list ]
+16 −3
Original line number Diff line number Diff line
@@ -345,6 +345,16 @@ AP_DECLARE(apr_status_t) ap_check_pipeline(conn_rec *c, apr_bucket_brigade *bb,
    return rv;
}

#define RETRIEVE_BRIGADE_FROM_POOL(bb, key, pool, allocator) do {       \
    apr_pool_userdata_get((void **)&bb, key, pool);                     \
    if (bb == NULL) {                                                   \
        bb = apr_brigade_create(pool, allocator);                       \
        apr_pool_userdata_setn((const void *)bb, key, NULL, pool);      \
    }                                                                   \
    else {                                                              \
        apr_brigade_cleanup(bb);                                        \
    }                                                                   \
} while(0)

AP_DECLARE(void) ap_process_request_after_handler(request_rec *r)
{
@@ -357,7 +367,8 @@ AP_DECLARE(void) ap_process_request_after_handler(request_rec *r)
     * this bucket is destroyed, the request will be logged and
     * its pool will be freed
     */
    bb = apr_brigade_create(c->pool, c->bucket_alloc);
    RETRIEVE_BRIGADE_FROM_POOL(bb, "ap_process_request_after_handler_brigade",
                               c->pool, c->bucket_alloc);
    b = ap_bucket_eor_create(c->bucket_alloc, r);
    APR_BRIGADE_INSERT_HEAD(bb, b);

@@ -383,7 +394,7 @@ AP_DECLARE(void) ap_process_request_after_handler(request_rec *r)
     */
    rv = ap_check_pipeline(c, bb, DEFAULT_LIMIT_BLANK_LINES);
    c->data_in_input_filters = (rv == APR_SUCCESS);
    apr_brigade_destroy(bb);
    apr_brigade_cleanup(bb);

    if (c->cs)
        c->cs->state = (c->aborted) ? CONN_STATE_LINGER
@@ -477,7 +488,8 @@ AP_DECLARE(void) ap_process_request(request_rec *r)
    ap_process_async_request(r);

    if (!c->data_in_input_filters) {
        bb = apr_brigade_create(c->pool, c->bucket_alloc);
        RETRIEVE_BRIGADE_FROM_POOL(bb, "ap_process_request_brigade", 
                                   c->pool, c->bucket_alloc);
        b = apr_bucket_flush_create(c->bucket_alloc);
        APR_BRIGADE_INSERT_HEAD(bb, b);
        rv = ap_pass_brigade(c->output_filters, bb);
@@ -490,6 +502,7 @@ AP_DECLARE(void) ap_process_request(request_rec *r)
            ap_log_cerror(APLOG_MARK, APLOG_INFO, rv, c, APLOGNO(01581)
                          "flushing data to the client");
        }
        apr_brigade_cleanup(bb);
    }
    if (ap_extended_status) {
        ap_time_process_request(c->sbh, STOP_PREQUEST);