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;
}