Loading modules/http2/h2_bucket_beam.c +11 −17 Original line number Diff line number Diff line Loading @@ -230,15 +230,12 @@ static apr_off_t bucket_mem_used(apr_bucket *b) static int report_consumption(h2_bucket_beam *beam) { int rv = 0; if (apr_atomic_read32(&beam->cons_ev_pending)) { if (beam->cons_io_cb) { beam->cons_io_cb(beam->cons_ctx, beam, beam->received_bytes - beam->cons_bytes_reported); rv = 1; } beam->cons_bytes_reported = beam->received_bytes; apr_atomic_set32(&beam->cons_ev_pending, 0); } return rv; } Loading Loading @@ -1024,7 +1021,6 @@ transfer: } if (transferred_buckets > 0) { apr_atomic_set32(&beam->cons_ev_pending, 1); if (beam->cons_ev_cb) { beam->cons_ev_cb(beam->cons_ctx, beam); } Loading Loading @@ -1199,15 +1195,13 @@ int h2_beam_no_files(void *ctx, h2_bucket_beam *beam, apr_file_t *file) int h2_beam_report_consumption(h2_bucket_beam *beam) { if (apr_atomic_read32(&beam->cons_ev_pending)) { h2_beam_lock bl; int rv = 0; if (enter_yellow(beam, &bl) == APR_SUCCESS) { int rv = report_consumption(beam); rv = report_consumption(beam); leave_yellow(beam, &bl); return rv; } } return 0; return rv; } void h2_beam_log(h2_bucket_beam *beam, conn_rec *c, int level, const char *msg) Loading modules/http2/h2_bucket_beam.h +0 −2 Original line number Diff line number Diff line Loading @@ -194,13 +194,11 @@ struct h2_bucket_beam { h2_beam_mutex_enter *m_enter; struct apr_thread_cond_t *m_cond; apr_uint32_t cons_ev_pending; /* != 0, consumer event pending */ apr_off_t cons_bytes_reported; /* amount of bytes reported as consumed */ h2_beam_ev_callback *cons_ev_cb; h2_beam_io_callback *cons_io_cb; void *cons_ctx; apr_uint32_t prod_ev_pending; /* != 0, producer event pending */ apr_off_t prod_bytes_reported; /* amount of bytes reported as produced */ h2_beam_io_callback *prod_io_cb; void *prod_ctx; Loading modules/http2/h2_mplx.c +3 −2 Original line number Diff line number Diff line Loading @@ -123,7 +123,8 @@ static apr_status_t beam_enter(void *ctx, h2_beam_lock *pbl) static void stream_output_consumed(void *ctx, h2_bucket_beam *beam, apr_off_t length) { h2_task *task = ctx; h2_stream *stream = ctx; h2_task *task = stream->task; if (length > 0 && task && task->assigned) { h2_req_engine_out_consumed(task->assigned, task->c, length); } Loading Loading @@ -613,7 +614,7 @@ static apr_status_t out_open(h2_mplx *m, int stream_id, h2_bucket_beam *beam) "h2_mplx(%s): out open", stream->task->id); } h2_beam_on_consumed(stream->output, NULL, stream_output_consumed, stream->task); h2_beam_on_consumed(stream->output, NULL, stream_output_consumed, stream); h2_beam_on_produced(stream->output, output_produced, m); beamed_count = h2_beam_get_files_beamed(stream->output); if (m->tx_handles_reserved >= beamed_count) { Loading modules/http2/h2_request.c +4 −1 Original line number Diff line number Diff line Loading @@ -170,7 +170,10 @@ apr_status_t h2_request_end_headers(h2_request *req, apr_pool_t *pool, int eos) s = apr_table_get(req->headers, "Content-Length"); if (!s) { /* no content-length given */ /* HTTP/2 does not need a Content-Length for framing, but our * internal request processing is used to HTTP/1.1, so we * need to either add a Content-Length or a Transfer-Encoding * if any content can be expected. */ if (!eos) { /* We have not seen a content-length and have no eos, * simulate a chunked encoding for our HTTP/1.1 infrastructure, Loading modules/http2/h2_session.c +20 −3 Original line number Diff line number Diff line Loading @@ -27,6 +27,8 @@ #include <http_log.h> #include <scoreboard.h> #include <mpm_common.h> #include "h2_private.h" #include "h2.h" #include "h2_bucket_eos.h" Loading Loading @@ -711,15 +713,30 @@ static h2_session *h2_session_create_int(conn_rec *c, { nghttp2_session_callbacks *callbacks = NULL; nghttp2_option *options = NULL; apr_allocator_t *allocator; apr_thread_mutex_t *mutex; uint32_t n; apr_pool_t *pool = NULL; apr_status_t status = apr_pool_create(&pool, c->pool); h2_session *session; apr_status_t status = apr_allocator_create(&allocator); if (status != APR_SUCCESS) { return NULL; } apr_allocator_max_free_set(allocator, ap_max_mem_free); apr_pool_create_ex(&pool, c->pool, NULL, allocator); if (!pool) { apr_allocator_destroy(allocator); return NULL; } apr_pool_tag(pool, "h2_session"); apr_allocator_owner_set(allocator, pool); status = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool); if (status != APR_SUCCESS) { apr_pool_destroy(pool); return NULL; } apr_allocator_mutex_set(allocator, mutex); /* get h2_session a lifetime beyond its pool and everything * connected to it. */ Loading Loading
modules/http2/h2_bucket_beam.c +11 −17 Original line number Diff line number Diff line Loading @@ -230,15 +230,12 @@ static apr_off_t bucket_mem_used(apr_bucket *b) static int report_consumption(h2_bucket_beam *beam) { int rv = 0; if (apr_atomic_read32(&beam->cons_ev_pending)) { if (beam->cons_io_cb) { beam->cons_io_cb(beam->cons_ctx, beam, beam->received_bytes - beam->cons_bytes_reported); rv = 1; } beam->cons_bytes_reported = beam->received_bytes; apr_atomic_set32(&beam->cons_ev_pending, 0); } return rv; } Loading Loading @@ -1024,7 +1021,6 @@ transfer: } if (transferred_buckets > 0) { apr_atomic_set32(&beam->cons_ev_pending, 1); if (beam->cons_ev_cb) { beam->cons_ev_cb(beam->cons_ctx, beam); } Loading Loading @@ -1199,15 +1195,13 @@ int h2_beam_no_files(void *ctx, h2_bucket_beam *beam, apr_file_t *file) int h2_beam_report_consumption(h2_bucket_beam *beam) { if (apr_atomic_read32(&beam->cons_ev_pending)) { h2_beam_lock bl; int rv = 0; if (enter_yellow(beam, &bl) == APR_SUCCESS) { int rv = report_consumption(beam); rv = report_consumption(beam); leave_yellow(beam, &bl); return rv; } } return 0; return rv; } void h2_beam_log(h2_bucket_beam *beam, conn_rec *c, int level, const char *msg) Loading
modules/http2/h2_bucket_beam.h +0 −2 Original line number Diff line number Diff line Loading @@ -194,13 +194,11 @@ struct h2_bucket_beam { h2_beam_mutex_enter *m_enter; struct apr_thread_cond_t *m_cond; apr_uint32_t cons_ev_pending; /* != 0, consumer event pending */ apr_off_t cons_bytes_reported; /* amount of bytes reported as consumed */ h2_beam_ev_callback *cons_ev_cb; h2_beam_io_callback *cons_io_cb; void *cons_ctx; apr_uint32_t prod_ev_pending; /* != 0, producer event pending */ apr_off_t prod_bytes_reported; /* amount of bytes reported as produced */ h2_beam_io_callback *prod_io_cb; void *prod_ctx; Loading
modules/http2/h2_mplx.c +3 −2 Original line number Diff line number Diff line Loading @@ -123,7 +123,8 @@ static apr_status_t beam_enter(void *ctx, h2_beam_lock *pbl) static void stream_output_consumed(void *ctx, h2_bucket_beam *beam, apr_off_t length) { h2_task *task = ctx; h2_stream *stream = ctx; h2_task *task = stream->task; if (length > 0 && task && task->assigned) { h2_req_engine_out_consumed(task->assigned, task->c, length); } Loading Loading @@ -613,7 +614,7 @@ static apr_status_t out_open(h2_mplx *m, int stream_id, h2_bucket_beam *beam) "h2_mplx(%s): out open", stream->task->id); } h2_beam_on_consumed(stream->output, NULL, stream_output_consumed, stream->task); h2_beam_on_consumed(stream->output, NULL, stream_output_consumed, stream); h2_beam_on_produced(stream->output, output_produced, m); beamed_count = h2_beam_get_files_beamed(stream->output); if (m->tx_handles_reserved >= beamed_count) { Loading
modules/http2/h2_request.c +4 −1 Original line number Diff line number Diff line Loading @@ -170,7 +170,10 @@ apr_status_t h2_request_end_headers(h2_request *req, apr_pool_t *pool, int eos) s = apr_table_get(req->headers, "Content-Length"); if (!s) { /* no content-length given */ /* HTTP/2 does not need a Content-Length for framing, but our * internal request processing is used to HTTP/1.1, so we * need to either add a Content-Length or a Transfer-Encoding * if any content can be expected. */ if (!eos) { /* We have not seen a content-length and have no eos, * simulate a chunked encoding for our HTTP/1.1 infrastructure, Loading
modules/http2/h2_session.c +20 −3 Original line number Diff line number Diff line Loading @@ -27,6 +27,8 @@ #include <http_log.h> #include <scoreboard.h> #include <mpm_common.h> #include "h2_private.h" #include "h2.h" #include "h2_bucket_eos.h" Loading Loading @@ -711,15 +713,30 @@ static h2_session *h2_session_create_int(conn_rec *c, { nghttp2_session_callbacks *callbacks = NULL; nghttp2_option *options = NULL; apr_allocator_t *allocator; apr_thread_mutex_t *mutex; uint32_t n; apr_pool_t *pool = NULL; apr_status_t status = apr_pool_create(&pool, c->pool); h2_session *session; apr_status_t status = apr_allocator_create(&allocator); if (status != APR_SUCCESS) { return NULL; } apr_allocator_max_free_set(allocator, ap_max_mem_free); apr_pool_create_ex(&pool, c->pool, NULL, allocator); if (!pool) { apr_allocator_destroy(allocator); return NULL; } apr_pool_tag(pool, "h2_session"); apr_allocator_owner_set(allocator, pool); status = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool); if (status != APR_SUCCESS) { apr_pool_destroy(pool); return NULL; } apr_allocator_mutex_set(allocator, mutex); /* get h2_session a lifetime beyond its pool and everything * connected to it. */ Loading