apr_status_t h2_task_do(h2_task *task, h2_worker *worker) { apr_status_t status = APR_SUCCESS; AP_DEBUG_ASSERT(task); task->serialize_headers = h2_config_geti(task->request->config, H2_CONF_SER_HEADERS); status = h2_worker_setup_task(worker, task); /* save in connection that this one is a pseudo connection */ h2_ctx_create_for(task->c, task); if (status == APR_SUCCESS) { task->input = h2_task_input_create(task, task->pool, task->c->bucket_alloc); task->output = h2_task_output_create(task, task->pool); ap_process_connection(task->c, h2_worker_get_socket(worker)); ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, task->c, "h2_task(%s): processing done", task->id); } else { ap_log_cerror(APLOG_MARK, APLOG_WARNING, status, task->c, APLOGNO(02957) "h2_task(%s): error setting up h2_task", task->id); } if (task->input) { h2_task_input_destroy(task->input); task->input = NULL; } if (task->output) { h2_task_output_close(task->output); h2_task_output_destroy(task->output); task->output = NULL; } if (task->io) { apr_thread_cond_signal(task->io); } h2_worker_release_task(worker, task); h2_mplx_task_done(task->mplx, task->stream_id); return status; }
apr_status_t h2_task_do(h2_task *task, h2_worker *worker) { apr_status_t status = APR_SUCCESS; h2_config *cfg = h2_config_get(task->mplx->c); h2_task_env env; AP_DEBUG_ASSERT(task); memset(&env, 0, sizeof(env)); env.id = task->id; env.stream_id = task->stream_id; env.mplx = task->mplx; task->mplx = NULL; env.input_eos = task->input_eos; env.serialize_headers = !!h2_config_geti(cfg, H2_CONF_SER_HEADERS); /* Create a subpool from the worker one to be used for all things * with life-time of this task_env execution. */ apr_pool_create(&env.pool, h2_worker_get_pool(worker)); /* Link the env to the worker which provides useful things such * as mutex, a socket etc. */ env.io = h2_worker_get_cond(worker); /* Clone fields, so that lifetimes become (more) independent. */ env.method = apr_pstrdup(env.pool, task->method); env.path = apr_pstrdup(env.pool, task->path); env.authority = apr_pstrdup(env.pool, task->authority); env.headers = apr_table_clone(env.pool, task->headers); /* Setup the pseudo connection to use our own pool and bucket_alloc */ if (task->c) { env.c = *task->c; task->c = NULL; status = h2_conn_setup(&env, worker); } else { status = h2_conn_init(&env, worker); } /* save in connection that this one is a pseudo connection, prevents * other hooks from messing with it. */ h2_ctx_create_for(&env.c, &env); if (status == APR_SUCCESS) { env.input = h2_task_input_create(&env, env.pool, env.c.bucket_alloc); env.output = h2_task_output_create(&env, env.pool, env.c.bucket_alloc); status = h2_conn_process(&env.c, h2_worker_get_socket(worker)); ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, &env.c, "h2_task(%s): processing done", env.id); } else { ap_log_cerror(APLOG_MARK, APLOG_WARNING, status, &env.c, "h2_task(%s): error setting up h2_task_env", env.id); } if (env.input) { h2_task_input_destroy(env.input); env.input = NULL; } if (env.output) { h2_task_output_close(env.output); h2_task_output_destroy(env.output); env.output = NULL; } h2_task_set_finished(task); if (env.io) { apr_thread_cond_signal(env.io); } if (env.pool) { apr_pool_destroy(env.pool); env.pool = NULL; } if (env.c.id) { h2_conn_post(&env.c, worker); } h2_mplx_task_done(env.mplx, env.stream_id); return status; }
apr_status_t h2_task_do(h2_task *task, h2_worker *worker) { apr_status_t status = APR_SUCCESS; h2_config *cfg = h2_config_get(task->mplx->c); AP_DEBUG_ASSERT(task); task->serialize_headers = h2_config_geti(cfg, H2_CONF_SER_HEADERS); /* Create a subpool from the worker one to be used for all things * with life-time of this task execution. */ apr_pool_create(&task->pool, h2_worker_get_pool(worker)); /* Link the task to the worker which provides useful things such * as mutex, a socket etc. */ task->io = h2_worker_get_cond(worker); status = h2_conn_setup(task, worker); /* save in connection that this one is a pseudo connection, prevents * other hooks from messing with it. */ h2_ctx_create_for(task->c, task); if (status == APR_SUCCESS) { task->input = h2_task_input_create(task, task->pool, task->c->bucket_alloc); task->output = h2_task_output_create(task, task->pool, task->c->bucket_alloc); status = h2_conn_process(task->c, h2_worker_get_socket(worker)); ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, task->c, "h2_task(%s): processing done", task->id); } else { ap_log_cerror(APLOG_MARK, APLOG_WARNING, status, task->c, APLOGNO(02957) "h2_task(%s): error setting up h2_task", task->id); } if (task->input) { h2_task_input_destroy(task->input); task->input = NULL; } if (task->output) { h2_task_output_close(task->output); h2_task_output_destroy(task->output); task->output = NULL; } if (task->io) { apr_thread_cond_signal(task->io); } if (task->pool) { apr_pool_destroy(task->pool); task->pool = NULL; } if (task->c->id) { h2_conn_post(task->c, worker); } h2_mplx_task_done(task->mplx, task->stream_id); return status; }