in modules/fcgid/fcgid_bridge.c [156:211]
apr_status_t bucket_ctx_cleanup(void *thectx)
{
/* Cleanup jobs:
1. Free bucket buffer
2. Return procnode
NOTE: ipc will be clean when request pool cleanup, so I don't need to close it here
*/
fcgid_bucket_ctx *ctx = (fcgid_bucket_ctx *) thectx;
request_rec *r = ctx->ipc.request;
/* Free bucket buffer */
if (ctx->buffer) {
apr_bucket_destroy(ctx->buffer);
ctx->buffer = NULL;
}
/* proc_close_ipc() and ipc_handle_cleanup() do their own sanity
* checks, but we'll do our own anyway
*/
if (ctx->ipc.ipc_handle_info) {
proc_close_ipc(&ctx->ipc);
ctx->ipc.ipc_handle_info = NULL;
}
if (ctx->procnode) {
++ctx->procnode->requests_handled;
/* Return procnode
I will return this slot to idle(or error) list
*/
if (ctx->procnode->diewhy == FCGID_DIE_BUSY_TIMEOUT) {
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
"mod_fcgid: %s took longer than busy timeout "
"(%d secs)",
r->uri,
ctx->procnode->cmdopts.busy_timeout);
return_procnode(r, ctx->procnode, 1 /* busy timeout */ );
}
else if (ctx->has_error) {
ctx->procnode->diewhy = FCGID_DIE_COMM_ERROR;
return_procnode(r, ctx->procnode, 1 /* communication error */ );
}
else if (ctx->procnode->cmdopts.max_requests_per_process
&& ctx->procnode->requests_handled >=
ctx->procnode->cmdopts.max_requests_per_process) {
ctx->procnode->diewhy = FCGID_DIE_LIFETIME_EXPIRED;
return_procnode(r, ctx->procnode, 1 /* handled all requests */ );
}
else
return_procnode(r, ctx->procnode, 0 /* communication ok */ );
ctx->procnode = NULL;
}
return APR_SUCCESS;
}