int WorkerBridge_Request()

in src/mod_rivet_ng/rivet_worker_mpm.c [582:636]


int WorkerBridge_Request (request_rec* r,rivet_req_ctype ctype)
{
    void*           v;
    apr_queue_t*    q = module_globals->mpm->queue;
    apr_status_t    rv;
    handler_private* request_obj;
    int             http_code;

    if (module_globals->mpm->server_shutdown == 1) {

        ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_EGENERAL, r,
                      MODNAME ": http request aborted during child process shutdown");

        return HTTP_INTERNAL_SERVER_ERROR;
    }

    do {

        rv = apr_queue_pop(q, &v);

    } while (rv == APR_EINTR);

    if (rv != APR_SUCCESS) {

        if (rv == APR_EOF) {
            fprintf(stderr, "request_processor: queue terminated APR_EOF\n");
        }

        return HTTP_INTERNAL_SERVER_ERROR;
    }

    request_obj = (handler_private *) v;
    apr_thread_mutex_lock(request_obj->mutex);

    request_obj->r = r;
    request_obj->ctype = ctype;
    request_obj->status = init;
    request_obj->code = OK;
    //request_obj->job_type = request;

    apr_thread_cond_signal(request_obj->cond);

    while (request_obj->status != done)
    {
        apr_thread_cond_wait(request_obj->cond,request_obj->mutex);
    }

    http_code = request_obj->code;
    request_obj->status = idle;

    apr_thread_cond_signal(request_obj->cond);
    apr_thread_mutex_unlock(request_obj->mutex);

    return http_code;
}