static void io_destroy(h2_mplx *m, h2_io *io, int events) { int reuse_slave; /* cleanup any buffered input */ h2_io_in_shutdown(io); if (events) { /* Process outstanding events before destruction */ io_in_consumed_signal(m, io); } /* The pool is cleared/destroyed which also closes all * allocated file handles. Give this count back to our * file handle pool. */ m->tx_handles_reserved += io->files_handles_owned; h2_io_set_remove(m->stream_ios, io); h2_io_set_remove(m->ready_ios, io); if (m->redo_ios) { h2_io_set_remove(m->redo_ios, io); } reuse_slave = ((m->spare_slaves->nelts < m->spare_slaves->nalloc) && !io->rst_error && io->eor); if (io->task) { conn_rec *slave = io->task->c; h2_task_destroy(io->task); io->task = NULL; if (reuse_slave && slave->keepalive == AP_CONN_KEEPALIVE) { apr_bucket_delete(io->eor); io->eor = NULL; APR_ARRAY_PUSH(m->spare_slaves, conn_rec*) = slave; }
static void h2_io_cleanup(h2_io *io) { if (io->task) { h2_task_destroy(io->task); io->task = NULL; } }
apr_status_t h2_stream_destroy(h2_stream *stream) { AP_DEBUG_ASSERT(stream); ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, stream->m->c, "h2_stream(%ld-%d): destroy", stream->m->id, stream->id); h2_stream_cleanup(stream); if (stream->task) { h2_task_destroy(stream->task); stream->task = NULL; } if (stream->pool) { apr_pool_destroy(stream->pool); } return APR_SUCCESS; }