apr_status_t h2_mplx_process(h2_mplx *m, int stream_id, const h2_request *req, h2_stream_pri_cmp *cmp, void *ctx) { apr_status_t status; int was_empty = 0; int acquired; AP_DEBUG_ASSERT(m); if ((status = enter_mutex(m, &acquired)) == APR_SUCCESS) { if (m->aborted) { status = APR_ECONNABORTED; } else { h2_io *io = open_io(m, stream_id); io->request = req; if (!io->request->body) { status = h2_io_in_close(io); } was_empty = h2_tq_empty(m->q); h2_tq_add(m->q, io->id, cmp, ctx); ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, m->c, "h2_mplx(%ld-%d): process", m->c->id, stream_id); H2_MPLX_IO_IN(APLOG_TRACE2, m, io, "h2_mplx_process"); } leave_mutex(m, acquired); } if (status == APR_SUCCESS && was_empty) { workers_register(m); } return status; }
h2_task *h2_mplx_pop_task(h2_mplx *m, h2_worker *w, int *has_more) { h2_task *task = NULL; apr_status_t status; AP_DEBUG_ASSERT(m); if (m->aborted) { *has_more = 0; return NULL; } status = apr_thread_mutex_lock(m->lock); if (APR_SUCCESS == status) { int sid; while (!task && (sid = h2_tq_shift(m->q)) > 0) { /* Anything not already setup correctly in the task * needs to be so now, as task will be executed right about * when this method returns. */ h2_io *io = h2_io_set_get(m->stream_ios, sid); if (io) { task = h2_worker_create_task(w, m, io->request, !io->request_body); } } *has_more = !h2_tq_empty(m->q); apr_thread_mutex_unlock(m->lock); } return task; }
h2_task *h2_mplx_pop_task(h2_mplx *m, int *has_more) { h2_task *task = NULL; AP_DEBUG_ASSERT(m); if (m->aborted) { *has_more = 0; return NULL; } apr_status_t status = apr_thread_mutex_lock(m->lock); if (APR_SUCCESS == status) { task = h2_tq_pop_first(m->q); if (task) { h2_task_set_started(task); } *has_more = !h2_tq_empty(m->q); apr_thread_mutex_unlock(m->lock); } return task; }
const h2_request *h2_mplx_pop_request(h2_mplx *m, int *has_more) { const h2_request *req = NULL; apr_status_t status; int acquired; AP_DEBUG_ASSERT(m); if ((status = enter_mutex(m, &acquired)) == APR_SUCCESS) { if (m->aborted) { req = NULL; *has_more = 0; } else { req = pop_request(m); *has_more = !h2_tq_empty(m->q); } leave_mutex(m, acquired); } return req; }