37#define H2_BLIST_INIT(b) APR_RING_INIT(&(b)->list, apr_bucket, link);
38#define H2_BLIST_SENTINEL(b) APR_RING_SENTINEL(&(b)->list, apr_bucket, link)
39#define H2_BLIST_EMPTY(b) APR_RING_EMPTY(&(b)->list, apr_bucket, link)
40#define H2_BLIST_FIRST(b) APR_RING_FIRST(&(b)->list)
41#define H2_BLIST_LAST(b) APR_RING_LAST(&(b)->list)
42#define H2_BLIST_INSERT_HEAD(b, e) do { \
43 apr_bucket *ap__b = (e); \
44 APR_RING_INSERT_HEAD(&(b)->list, ap__b, apr_bucket, link); \
46#define H2_BLIST_INSERT_TAIL(b, e) do { \
47 apr_bucket *ap__b = (e); \
48 APR_RING_INSERT_TAIL(&(b)->list, ap__b, apr_bucket, link); \
50#define H2_BLIST_CONCAT(a, b) do { \
51 APR_RING_CONCAT(&(a)->list, &(b)->list, apr_bucket, link); \
53#define H2_BLIST_PREPEND(a, b) do { \
54 APR_RING_PREPEND(&(a)->list, &(b)->list, apr_bucket, link); \
73#define H2_BEAM_LOG(beam, c, level, rv, msg, bb) \
75 if (APLOG_C_IS_LEVEL((c),(level))) { \
76 char buffer[4 * 1024]; \
77 apr_size_t len, bmax = sizeof(buffer)/sizeof(buffer[0]); \
78 len = bb? h2_util_bb_print(buffer, bmax, "", "", bb) : 0; \
79 ap_log_cerror(APLOG_MARK, (level), rv, (c), \
80 "BEAM[%s,%s%sdata=%ld,buckets(send/consumed)=%d/%d]: %s %s", \
82 (beam)->aborted? "aborted," : "", \
83 buffer_is_empty(beam)? "empty," : "", \
84 (long)get_buffered_data_len(beam), \
85 h2_blist_count(&(beam)->buckets_to_send), \
86 h2_blist_count(&(beam)->buckets_consumed), \
87 (msg), len? buffer : ""); \
128 beam->recv_bytes_reported +=
len;
183 if (
beam->max_buf_size > 0) {
185 return (
beam->max_buf_size >
len? (
beam->max_buf_size -
len) : 0);
203 else if (
beam->closed) {
209 else if (
beam->timeout > 0) {
236 if (
beam->timeout > 0) {
319 beam->tx_mem_limits = 1;
320 beam->max_buf_size = max_buf_size;
380 if (
c ==
beam->from) {
479 if (
b->length == 0) {
644#if AP_HAS_RESPONSE_BUCKETS
665 else if (
bsender->length == 0) {
683 int setaside = (
f->readpool != bb->
p);
735 else if (
beam->aborted) {
738 else if (
beam->closed) {
771 beam->recv_cb = recv_cb;
780 beam->eagain_cb = eagain_cb;
798 beam->was_empty_cb = was_empty_cb;
const char apr_size_t len
APR-UTIL Buckets/Bucket Brigades.
APR general purpose library routines.
APR Condition Variable Routines.
APR Thread Mutex Routines.
#define AP_BUCKET_IS_ERROR(e)
apr_bucket * ap_bucket_error_create(int error, const char *buf, apr_pool_t *p, apr_bucket_alloc_t *list)
#define AP_BUCKET_IS_EOR(e)
#define APR_STATUS_IS_EAGAIN(s)
#define APR_BUCKET_IS_FILE(e)
#define APR_BUCKET_IS_FLUSH(e)
#define APR_BUCKET_REMOVE(e)
#define APR_BUCKET_IS_HEAP(e)
#define APR_BUCKET_IS_METADATA(e)
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define APR_BRIGADE_INSERT_HEAD(b, e)
#define APR_BUCKET_NEXT(e)
#define APR_BRIGADE_EMPTY(b)
#define apr_bucket_delete(e)
#define APR_BUCKET_IS_EOS(e)
apr_brigade_flush void * ctx
#define apr_bucket_setaside(e, p)
#define APR_BRIGADE_FIRST(b)
#define apr_bucket_read(e, str, len, block)
const char int apr_pool_t * pool
void const char apr_status_t(* cleanup)(void *))
apr_vformatter_buff_t * c
const char apr_uint32_t * id
#define apr_pcalloc(p, size)
apr_int64_t apr_interval_time_t
void h2_beam_abort(h2_bucket_beam *beam, conn_rec *c)
static apr_status_t beam_cleanup(void *data)
#define H2_BLIST_FIRST(b)
apr_size_t h2_beam_buffer_size_get(h2_bucket_beam *beam)
void h2_beam_on_received(h2_bucket_beam *beam, h2_beam_ev_callback *recv_cb, void *ctx)
apr_interval_time_t h2_beam_timeout_get(h2_bucket_beam *beam)
void h2_beam_on_eagain(h2_bucket_beam *beam, h2_beam_ev_callback *eagain_cb, void *ctx)
static apr_status_t wait_not_full(h2_bucket_beam *beam, conn_rec *c, apr_read_type_e block, apr_size_t *pspace_left)
apr_status_t h2_beam_destroy(h2_bucket_beam *beam, conn_rec *c)
static apr_status_t append_bucket(h2_bucket_beam *beam, apr_bucket_brigade *bb, apr_read_type_e block, apr_size_t *pspace_left, apr_off_t *pwritten)
void h2_beam_on_was_empty(h2_bucket_beam *beam, h2_beam_ev_callback *was_empty_cb, void *ctx)
int h2_beam_empty(h2_bucket_beam *beam)
void h2_beam_timeout_set(h2_bucket_beam *beam, apr_interval_time_t timeout)
static void purge_eor_buckets(h2_bucket_beam *beam)
void h2_beam_close(h2_bucket_beam *beam, conn_rec *c)
static int bucket_is_mmap(apr_bucket *b)
static int h2_blist_count(h2_blist *blist)
apr_status_t h2_beam_create(h2_bucket_beam **pbeam, conn_rec *from, apr_pool_t *pool, int id, const char *tag, apr_size_t max_buf_size, apr_interval_time_t timeout)
#define H2_BEAM_LOG(beam, c, level, rv, msg, bb)
apr_off_t h2_beam_get_mem_used(h2_bucket_beam *beam)
static void beam_shutdown(h2_bucket_beam *beam, apr_shutdown_how_e how)
static void purge_consumed_buckets(h2_bucket_beam *beam)
static int report_consumption(h2_bucket_beam *beam, int locked)
static apr_size_t calc_buffered(h2_bucket_beam *beam)
static int buffer_is_empty(h2_bucket_beam *beam)
#define H2_BLIST_SENTINEL(b)
apr_status_t h2_beam_send(h2_bucket_beam *beam, conn_rec *from, apr_bucket_brigade *sender_bb, apr_read_type_e block, apr_off_t *pwritten)
void h2_beam_on_send(h2_bucket_beam *beam, h2_beam_ev_callback *send_cb, void *ctx)
static apr_off_t get_buffered_data_len(h2_bucket_beam *beam)
static apr_size_t calc_space_left(h2_bucket_beam *beam)
static apr_off_t bucket_mem_used(apr_bucket *b)
int h2_beam_is_complete(h2_bucket_beam *beam)
static apr_status_t wait_not_empty(h2_bucket_beam *beam, conn_rec *c, apr_read_type_e block)
void h2_beam_set_copy_files(h2_bucket_beam *beam, int enabled)
#define H2_BLIST_EMPTY(b)
int h2_beam_report_consumption(h2_bucket_beam *beam)
static void h2_blist_cleanup(h2_blist *bl)
void h2_beam_on_consumed(h2_bucket_beam *beam, h2_beam_io_callback *io_cb, void *ctx)
#define H2_BLIST_INSERT_TAIL(b, e)
apr_off_t h2_beam_get_buffered(h2_bucket_beam *beam)
void h2_beam_buffer_size_set(h2_bucket_beam *beam, apr_size_t buffer_size)
apr_status_t h2_beam_receive(h2_bucket_beam *beam, conn_rec *to, apr_bucket_brigade *bb, apr_read_type_e block, apr_off_t readbytes)
void h2_beam_ev_callback(void *ctx, h2_bucket_beam *beam)
void h2_beam_io_callback(void *ctx, h2_bucket_beam *beam, apr_off_t bytes)
#define h2_conn_ctx_get(c)
static ssize_t send_cb(nghttp2_session *ngh2, const uint8_t *data, size_t length, int flags, void *userp)
A bucket referring to an HTTP error.
apr_bucket_alloc_t * bucket_alloc
Structure to store things which are per connection.