コード例 #1
0
ファイル: h2_session.c プロジェクト: bipinu/mod_h2
static int stream_close_finished(void *ctx, h2_stream *stream) {
    assert(ctx);
    h2_session *session = (h2_session *)ctx;
    h2_task *task = stream->task;
    if (!task || h2_task_has_finished(task)) {
        ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, session->c,
                      "h2_session(%ld): reaping zombie stream(%d)",
                      session->id, stream->id);
        h2_stream_set_remove(session->zombies, stream);
        h2_stream_destroy(stream);
    }
    return 1;
}
コード例 #2
0
ファイル: h2_session.c プロジェクト: bipinu/mod_h2
static apr_status_t join_zombie_stream(h2_session *session, h2_stream *stream)
{
    apr_status_t status = APR_SUCCESS;
    ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, session->c,
                  "h2_stream(%ld-%d): join zombie",
                  session->id, (int)stream->id);
    
    h2_stream_set_remove(session->zombies, stream);
    if (session->before_stream_close_cb && stream->task) {
        status = session->before_stream_close_cb(session, stream,
                                                 stream->task, 1);
    }
    h2_stream_destroy(stream);
    return status;
}
コード例 #3
0
ファイル: h2_session.c プロジェクト: NeedfulThings/mod_h2
apr_status_t h2_session_stream_destroy(h2_session *session, h2_stream *stream)
{
    apr_pool_t *pool = h2_stream_detach_pool(stream);

    h2_mplx_stream_done(session->mplx, stream->id, stream->rst_error);
    h2_stream_set_remove(session->streams, stream->id);
    h2_stream_destroy(stream);
    
    if (pool) {
        apr_pool_clear(pool);
        if (session->spare) {
            apr_pool_destroy(session->spare);
        }
        session->spare = pool;
    }
    return APR_SUCCESS;
}
コード例 #4
0
ファイル: h2_mplx.c プロジェクト: stevedien/mod_h2
static void stream_destroy(h2_mplx *m, h2_stream *stream, h2_io *io)
{
    apr_pool_t *pool = h2_stream_detach_pool(stream);
    if (pool) {
        apr_pool_clear(pool);
        if (m->spare_pool) {
            apr_pool_destroy(m->spare_pool);
        }
        m->spare_pool = pool;
    }
    h2_stream_destroy(stream);
    if (io) {
        /* The pool is cleared/destroyed which also closes all
         * allocated file handles. Give this count back to our
         * file handle pool. */
        m->file_handles_allowed += io->files_handles_owned;
        h2_io_set_remove(m->stream_ios, io);
        h2_io_destroy(io);
    }
}
コード例 #5
0
ファイル: h2_session.c プロジェクト: bipinu/mod_h2
static apr_status_t close_active_stream(h2_session *session,
                                        h2_stream *stream,
                                        int join)
{
    apr_status_t status = APR_SUCCESS;
    ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, session->c,
                  "h2_stream(%ld-%d): closing",
                  session->id, (int)stream->id);
    
    h2_stream_set_remove(session->streams, stream);
    if (session->before_stream_close_cb && stream->task) {
        status = session->before_stream_close_cb(session, stream,
                                                 stream->task, join);
    }
    if (status == APR_SUCCESS) {
        h2_mplx_close_io(session->mplx, stream->id);
        h2_stream_destroy(stream);
    }
    else if (status == APR_EAGAIN) {
        h2_stream_set_add(session->zombies, stream);
    }
    return status;
}