MCPcopy Create free account
hub / github.com/apache/httpd / h2_beam_send

Function h2_beam_send

modules/http2/h2_bucket_beam.c:530–594  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

528}
529
530apr_status_t h2_beam_send(h2_bucket_beam *beam, conn_rec *from,
531 apr_bucket_brigade *sender_bb,
532 apr_read_type_e block,
533 apr_off_t *pwritten)
534{
535 apr_status_t rv = APR_SUCCESS;
536 apr_size_t space_left = 0;
537 int was_empty;
538
539 ap_assert(beam->pool);
540
541 /* Called from the sender thread to add buckets to the beam */
542 apr_thread_mutex_lock(beam->lock);
543 ap_assert(beam->from == from);
544 ap_assert(sender_bb);
545 H2_BEAM_LOG(beam, from, APLOG_TRACE2, rv, "start send", sender_bb);
546 purge_consumed_buckets(beam);
547 *pwritten = 0;
548 was_empty = buffer_is_empty(beam);
549
550 space_left = calc_space_left(beam);
551 while (!APR_BRIGADE_EMPTY(sender_bb) && APR_SUCCESS == rv) {
552 rv = append_bucket(beam, sender_bb, block, &space_left, pwritten);
553 if (beam->aborted) {
554 goto cleanup;
555 }
556 else if (APR_EAGAIN == rv) {
557 /* bucket was not added, as beam buffer has no space left.
558 * Trigger event callbacks, so receiver can know there is something
559 * to receive before we do a conditional wait. */
560 purge_consumed_buckets(beam);
561 if (beam->send_cb) {
562 beam->send_cb(beam->send_ctx, beam);
563 }
564 if (was_empty && beam->was_empty_cb) {
565 beam->was_empty_cb(beam->was_empty_ctx, beam);
566 }
567 rv = wait_not_full(beam, from, block, &space_left);
568 if (APR_SUCCESS != rv) {
569 break;
570 }
571 was_empty = buffer_is_empty(beam);
572 }
573 }
574
575cleanup:
576 if (beam->send_cb && !buffer_is_empty(beam)) {
577 beam->send_cb(beam->send_ctx, beam);
578 }
579 if (was_empty && beam->was_empty_cb && !buffer_is_empty(beam)) {
580 beam->was_empty_cb(beam->was_empty_ctx, beam);
581 }
582 apr_thread_cond_broadcast(beam->change);
583
584 report_consumption(beam, 1);
585 if (beam->aborted) {
586 rv = APR_ECONNABORTED;
587 }

Callers 2

beam_outFunction · 0.85
input_flushFunction · 0.85

Calls 6

purge_consumed_bucketsFunction · 0.85
buffer_is_emptyFunction · 0.85
calc_space_leftFunction · 0.85
wait_not_fullFunction · 0.85
report_consumptionFunction · 0.85
append_bucketFunction · 0.70

Tested by

no test coverage detected