summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorStefan Eissing <icing@apache.org>2022-09-21 11:23:24 +0000
committerStefan Eissing <icing@apache.org>2022-09-21 11:23:24 +0000
commit8ea5f43aa768b772ace157669b689ba5d1327a49 (patch)
treee5ff329e991ebbe28cb849cccea6624e44e984ed /modules
parentcbb10f366c95401b717e26791d31f1d084dee195 (diff)
downloadhttpd-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.c70
-rw-r--r--modules/http2/h2_bucket_beam.h4
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;