in modules/fcgid/fcgid_pm_win.c [162:217]
apr_status_t procmgr_send_spawn_cmd(fcgid_command * command,
request_rec * r)
{
if (g_thread && g_msgqueue && !g_must_exit
&& g_reqlock && g_notifyqueue) {
apr_status_t rv;
/*
Prepare the message send to another thread
destroy the message if I can't push to message
*/
fcgid_command *postcmd =
(fcgid_command *) malloc(sizeof(fcgid_command));
if (!postcmd)
return APR_ENOMEM;
memcpy(postcmd, command, sizeof(*command));
/* Get request lock first */
if ((rv = apr_thread_mutex_lock(g_reqlock)) != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
"mod_fcgid: can't get request lock");
return rv;
}
/* Try push the message */
if ((rv = apr_queue_push(g_msgqueue, postcmd)) != APR_SUCCESS) {
apr_thread_mutex_unlock(g_reqlock);
free(postcmd);
ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
"mod_fcgid: can't push request message");
return rv;
} else {
/* Wait the respond from process manager */
char *notifybyte = NULL;
if ((rv =
apr_queue_pop(g_notifyqueue,
(void **)¬ifybyte)) != APR_SUCCESS) {
apr_thread_mutex_unlock(g_reqlock);
ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
"mod_fcgid: can't pop notify message");
return rv;
}
}
/* Release the lock now */
if ((rv = apr_thread_mutex_unlock(g_reqlock)) != APR_SUCCESS) {
/* It's a fatal error */
ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
"mod_fcgid: can't release request lock");
exit(1);
}
}
return APR_SUCCESS;
}