diff options
author | Stefan Eissing <icing@apache.org> | 2022-09-21 11:23:24 +0000 |
---|---|---|
committer | Stefan Eissing <icing@apache.org> | 2022-09-21 11:23:24 +0000 |
commit | 8ea5f43aa768b772ace157669b689ba5d1327a49 (patch) | |
tree | e5ff329e991ebbe28cb849cccea6624e44e984ed /modules | |
parent | cbb10f366c95401b717e26791d31f1d084dee195 (diff) | |
download | httpd-8ea5f43aa768b772ace157669b689ba5d1327a49.tar.gz |
*) mod_http2: removing bucket splitting into an extra recv brigade.
buckets are always received as a whole now, even if the total size
exceeds the receivers specified length. This simplifies the internal
handling and, since these buckets already exist, lead to less memory
consumption overall.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1904189 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules')
-rw-r--r-- | modules/http2/h2_bucket_beam.c | 70 | ||||
-rw-r--r-- | modules/http2/h2_bucket_beam.h | 4 |
2 files changed, 3 insertions, 71 deletions
diff --git a/modules/http2/h2_bucket_beam.c b/modules/http2/h2_bucket_beam.c index 05ca623c58..657d62f825 100644 --- a/modules/http2/h2_bucket_beam.c +++ b/modules/http2/h2_bucket_beam.c @@ -170,8 +170,7 @@ static apr_size_t calc_space_left(h2_bucket_beam *beam) static int buffer_is_empty(h2_bucket_beam *beam) { - return ((!beam->recv_buffer || APR_BRIGADE_EMPTY(beam->recv_buffer)) - && H2_BLIST_EMPTY(&beam->buckets_to_send)); + return H2_BLIST_EMPTY(&beam->buckets_to_send); } static apr_status_t wait_not_empty(h2_bucket_beam *beam, conn_rec *c, apr_read_type_e block) @@ -236,31 +235,6 @@ static void h2_blist_cleanup(h2_blist *bl) } } -static void recv_buffer_cleanup(h2_bucket_beam *beam) -{ - apr_bucket_brigade *bb = beam->recv_buffer; - - beam->recv_buffer = NULL; - - if (bb && !APR_BRIGADE_EMPTY(bb)) { - apr_off_t bblen = 0; - - apr_brigade_length(bb, 0, &bblen); - beam->recv_bytes += bblen; - - /* need to do this unlocked since bucket destroy might - * call this beam again. */ - apr_thread_mutex_unlock(beam->lock); - apr_brigade_destroy(bb); - apr_thread_mutex_lock(beam->lock); - - apr_thread_cond_broadcast(beam->change); - if (beam->recv_cb) { - beam->recv_cb(beam->recv_ctx, beam); - } - } -} - static void beam_shutdown(h2_bucket_beam *beam, apr_shutdown_how_e how) { if (!beam->pool) { @@ -274,12 +248,6 @@ static void beam_shutdown(h2_bucket_beam *beam, apr_shutdown_how_e how) beam->recv_cb = NULL; } - /* shutdown receiver (or both)? */ - if (how != APR_SHUTDOWN_WRITE) { - recv_buffer_cleanup(beam); - beam->recv_cb = NULL; - } - /* shutdown sender (or both)? */ if (how != APR_SHUTDOWN_READ) { h2_blist_cleanup(&beam->buckets_to_send); @@ -603,21 +571,6 @@ transfer: ap_assert(beam->pool); - /* transfer enough buckets from our receiver brigade, if we have one */ - while (remain >= 0 - && beam->recv_buffer - && !APR_BRIGADE_EMPTY(beam->recv_buffer)) { - - brecv = APR_BRIGADE_FIRST(beam->recv_buffer); - if (brecv->length > 0 && remain <= 0) { - break; - } - APR_BUCKET_REMOVE(brecv); - APR_BRIGADE_INSERT_TAIL(bb, brecv); - remain -= brecv->length; - ++transferred; - } - /* transfer from our sender brigade, transforming sender buckets to * receiver ones until we have enough */ while (remain >= 0 && !H2_BLIST_EMPTY(&beam->buckets_to_send)) { @@ -713,24 +666,6 @@ transfer: ++consumed_buckets; } - if (remain < 0) { - /* too much, put some back into out recv_buffer */ - remain = readbytes; - for (brecv = APR_BRIGADE_FIRST(bb); - brecv != APR_BRIGADE_SENTINEL(bb); - brecv = APR_BUCKET_NEXT(brecv)) { - remain -= (beam->tx_mem_limits? bucket_mem_used(brecv) - : (apr_off_t)brecv->length); - if (remain < 0) { - apr_bucket_split(brecv, (apr_size_t)((apr_off_t)brecv->length+remain)); - beam->recv_buffer = apr_brigade_split_ex(bb, - APR_BUCKET_NEXT(brecv), - beam->recv_buffer); - break; - } - } - } - if (beam->recv_cb && consumed_buckets > 0) { beam->recv_cb(beam->recv_ctx, beam); } @@ -834,8 +769,7 @@ apr_off_t h2_beam_get_mem_used(h2_bucket_beam *beam) static int is_empty(h2_bucket_beam *beam) { - return (H2_BLIST_EMPTY(&beam->buckets_to_send) - && (!beam->recv_buffer || APR_BRIGADE_EMPTY(beam->recv_buffer))); + return H2_BLIST_EMPTY(&beam->buckets_to_send); } int h2_beam_empty(h2_bucket_beam *beam) diff --git a/modules/http2/h2_bucket_beam.h b/modules/http2/h2_bucket_beam.h index dced250dba..934a893d99 100644 --- a/modules/http2/h2_bucket_beam.h +++ b/modules/http2/h2_bucket_beam.h @@ -48,9 +48,7 @@ struct h2_bucket_beam { apr_pool_t *pool; h2_blist buckets_to_send; h2_blist buckets_consumed; - apr_bucket_brigade *recv_buffer; - apr_pool_t *recv_pool; - + apr_size_t max_buf_size; apr_interval_time_t timeout; |