You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@apache.org on 2009/10/27 14:56:17 UTC
svn commit: r830188 - in /httpd/mod_fcgid/trunk/modules/fcgid:
fcgid_bridge.c fcgid_pm_main.c fcgid_proctbl.h fcgid_proctbl_unix.c
fcgid_proctbl_win.c
Author: trawick
Date: Tue Oct 27 13:56:17 2009
New Revision: 830188
URL: http://svn.apache.org/viewvc?rev=830188&view=rev
Log:
separate [un]locking of the process table by the PM and
the request handling threads for better logging
(and potentially context-appropriate error handling in
the future)
Modified:
httpd/mod_fcgid/trunk/modules/fcgid/fcgid_bridge.c
httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_main.c
httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl.h
httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_unix.c
httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_win.c
Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_bridge.c
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_bridge.c?rev=830188&r1=830187&r2=830188&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_bridge.c (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_bridge.c Tue Oct 27 13:56:17 2009
@@ -33,7 +33,7 @@
#define FCGID_APPLY_TRY_COUNT 2
#define FCGID_REQUEST_COUNT 32
-static fcgid_procnode *apply_free_procnode(server_rec * s,
+static fcgid_procnode *apply_free_procnode(request_rec *r,
fcgid_command * command)
{
/* Scan idle list, find a node match inode, deviceid and groupid
@@ -51,7 +51,7 @@
previous_node = proctable_get_idle_list();
busy_list_header = proctable_get_busy_list();
- safe_lock(s);
+ proctable_lock(r);
current_node = &proc_table[previous_node->next_index];
while (current_node != proc_table) {
next_node = &proc_table[current_node->next_index];
@@ -68,21 +68,21 @@
current_node->next_index = busy_list_header->next_index;
busy_list_header->next_index = current_node - proc_table;
- safe_unlock(s);
+ proctable_unlock(r);
return current_node;
} else
previous_node = current_node;
current_node = next_node;
}
- safe_unlock(s);
+ proctable_unlock(r);
/* Found nothing */
return NULL;
}
static void
-return_procnode(server_rec * s,
+return_procnode(request_rec *r,
fcgid_procnode * procnode, int communicate_error)
{
fcgid_procnode *previous_node, *current_node, *next_node;
@@ -91,7 +91,7 @@
fcgid_procnode *idle_list_header = proctable_get_idle_list();
fcgid_procnode *busy_list_header = proctable_get_busy_list();
- safe_lock(s);
+ proctable_lock(r);
/* Unlink the node from busy list first */
previous_node = busy_list_header;
@@ -118,18 +118,18 @@
idle_list_header->next_index = procnode - proc_table;
}
- safe_unlock(s);
+ proctable_unlock(r);
}
static int
-count_busy_processes(server_rec * s, fcgid_command * command)
+count_busy_processes(request_rec *r, fcgid_command * command)
{
int result = 0;
fcgid_procnode *previous_node, *current_node, *next_node;
fcgid_procnode *proc_table = proctable_get_table_array();
fcgid_procnode *busy_list_header = proctable_get_busy_list();
- safe_lock(s);
+ proctable_lock(r);
previous_node = busy_list_header;
current_node = &proc_table[previous_node->next_index];
@@ -146,7 +146,7 @@
current_node = next_node;
}
- safe_unlock(s);
+ proctable_unlock(r);
return result;
}
@@ -193,16 +193,16 @@
sconf->busy_timeout, dt);
} else if (ctx->has_error) {
ctx->procnode->diewhy = FCGID_DIE_COMM_ERROR;
- return_procnode(s, ctx->procnode,
+ 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(s, ctx->procnode,
+ return_procnode(r, ctx->procnode,
1 /* handled all requests */ );
} else
- return_procnode(s, ctx->procnode,
+ return_procnode(r, ctx->procnode,
0 /* communication ok */ );
ctx->procnode = NULL;
@@ -328,7 +328,7 @@
/* Apply a process slot */
bucket_ctx->procnode =
- apply_free_procnode(r->server, &fcgi_request);
+ apply_free_procnode(r, &fcgi_request);
if (bucket_ctx->procnode)
break;
@@ -336,11 +336,11 @@
busy processes; the problem is just that we haven't spawned
anything yet, so waiting is pointless */
if (i > 0 || j > 0
- || count_busy_processes(r->server, &fcgi_request)) {
+ || count_busy_processes(r, &fcgi_request)) {
apr_sleep(apr_time_from_sec(1));
bucket_ctx->procnode =
- apply_free_procnode(r->server, &fcgi_request);
+ apply_free_procnode(r, &fcgi_request);
if (bucket_ctx->procnode)
break;
}
@@ -355,7 +355,7 @@
&bucket_ctx->ipc) != APR_SUCCESS) {
proc_close_ipc(&bucket_ctx->ipc);
bucket_ctx->procnode->diewhy = FCGID_DIE_CONNECT_ERROR;
- return_procnode(r->server, bucket_ctx->procnode,
+ return_procnode(r, bucket_ctx->procnode,
1 /* has error */ );
bucket_ctx->procnode = NULL;
} else
Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_main.c
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_main.c?rev=830188&r1=830187&r2=830188&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_main.c (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_main.c Tue Oct 27 13:56:17 2009
@@ -34,10 +34,10 @@
fcgid_procnode * header,
fcgid_procnode * node, fcgid_procnode * table_array)
{
- safe_lock(main_server);
+ proctable_pm_lock(main_server);
node->next_index = header->next_index;
header->next_index = node - table_array;
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
}
static apr_time_t lastidlescan = 0;
@@ -69,7 +69,7 @@
previous_node = proctable_get_idle_list();
error_list_header = proctable_get_error_list();
- safe_lock(main_server);
+ proctable_pm_lock(main_server);
current_node = &proc_table[previous_node->next_index];
while (current_node != proc_table) {
next_node = &proc_table[current_node->next_index];
@@ -101,7 +101,7 @@
current_node = next_node;
}
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
}
static apr_time_t lastbusyscan = 0;
@@ -131,7 +131,7 @@
previous_node = proctable_get_busy_list();
error_list_header = proctable_get_error_list();
- safe_lock(main_server);
+ proctable_pm_lock(main_server);
current_node = &proc_table[previous_node->next_index];
while (current_node != proc_table) {
next_node = &proc_table[current_node->next_index];
@@ -154,7 +154,7 @@
current_node = next_node;
}
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
}
static apr_time_t lastzombiescan = 0;
@@ -194,7 +194,7 @@
error_list_header = proctable_get_error_list();
check_list_header = &temp_header;
- safe_lock(main_server);
+ proctable_pm_lock(main_server);
current_node = &proc_table[previous_node->next_index];
while (current_node != proc_table) {
next_node = &proc_table[current_node->next_index];
@@ -214,7 +214,7 @@
current_node = next_node;
}
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
/*
Now check every node in check list
@@ -249,7 +249,7 @@
Now link the check list back to the tail of idle list
*/
if (check_list_header->next_index) {
- safe_lock(main_server);
+ proctable_pm_lock(main_server);
previous_node = proctable_get_idle_list();
current_node = &proc_table[previous_node->next_index];
@@ -261,7 +261,7 @@
/* Link check list to the tail of idle list */
previous_node->next_index = check_list_header->next_index;
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
}
}
@@ -291,10 +291,10 @@
/* Try wait dead processes, restore to free list */
/* Note: I can't keep the lock during the scan */
- safe_lock(main_server);
+ proctable_pm_lock(main_server);
temp_error_header.next_index = error_list_header->next_index;
error_list_header->next_index = 0;
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
previous_node = &temp_error_header;
current_node = &proc_table[previous_node->next_index];
@@ -338,7 +338,7 @@
}
/* Link the temp error list back */
- safe_lock(main_server);
+ proctable_pm_lock(main_server);
/* Find the tail of error list */
previous_node = error_list_header;
current_node = &proc_table[previous_node->next_index];
@@ -347,7 +347,7 @@
current_node = &proc_table[current_node->next_index];
}
previous_node->next_index = temp_error_header.next_index;
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
}
static void kill_all_subprocess(server_rec * main_server)
@@ -474,9 +474,9 @@
proctable_array = proctable_get_table_array();
/* Apply a slot from free list */
- safe_lock(main_server);
+ proctable_pm_lock(main_server);
if (free_list_header->next_index == 0) {
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, main_server,
"mod_fcgid: too much processes, please increase FCGID_MAX_APPLICATION");
return;
@@ -484,7 +484,7 @@
procnode = &proctable_array[free_list_header->next_index];
free_list_header->next_index = procnode->next_index;
procnode->next_index = 0;
- safe_unlock(main_server);
+ proctable_pm_unlock(main_server);
/* Prepare to spawn */
procnode->deviceid = command->deviceid;
Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl.h
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl.h?rev=830188&r1=830187&r2=830188&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl.h (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl.h Tue Oct 27 13:56:17 2009
@@ -85,8 +85,10 @@
size_t proctable_get_table_size(void);
fcgid_global_share *proctable_get_globalshare(void);
-void safe_lock(server_rec * s);
-void safe_unlock(server_rec * s);
+void proctable_pm_lock(server_rec *s);
+void proctable_pm_unlock(server_rec *s);
+void proctable_lock(request_rec *r);
+void proctable_unlock(request_rec *r);
/* Just for debug */
void proctable_print_debug_info(server_rec * main_server);
Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_unix.c
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_unix.c?rev=830188&r1=830187&r2=830188&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_unix.c (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_unix.c Tue Oct 27 13:56:17 2009
@@ -245,7 +245,35 @@
return g_table_size;
}
-void safe_lock(server_rec * s)
+void proctable_lock(request_rec *r)
+{
+ /* Lock error is a fatal error */
+ apr_status_t rv;
+
+ if ((rv = proctable_lock_internal()) != APR_SUCCESS) {
+ ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
+ "mod_fcgid: can't lock process table in pid %"
+ APR_PID_T_FMT,
+ getpid());
+ exit(1);
+ }
+}
+
+void proctable_unlock(request_rec *r)
+{
+ /* Lock error is a fatal error */
+ apr_status_t rv;
+
+ if ((rv = proctable_unlock_internal()) != APR_SUCCESS) {
+ ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
+ "mod_fcgid: can't unlock process table in pid %"
+ APR_PID_T_FMT,
+ getpid());
+ exit(1);
+ }
+}
+
+void proctable_pm_lock(server_rec *s)
{
apr_status_t rv;
@@ -260,20 +288,22 @@
/* Lock error is a fatal error */
if ((rv = proctable_lock_internal()) != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
- "mod_fcgid: can't get lock in pid %" APR_PID_T_FMT,
+ "mod_fcgid: can't lock process table in PM, pid %"
+ APR_PID_T_FMT,
getpid());
exit(1);
}
}
-void safe_unlock(server_rec * s)
+void proctable_pm_unlock(server_rec *s)
{
/* Lock error is a fatal error */
apr_status_t rv;
if ((rv = proctable_unlock_internal()) != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
- "mod_fcgid: can't unlock in pid %" APR_PID_T_FMT,
+ "mod_fcgid: can't unlock process table in PM, pid %"
+ APR_PID_T_FMT,
getpid());
exit(1);
}
Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_win.c
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_win.c?rev=830188&r1=830187&r2=830188&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_win.c (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proctbl_win.c Tue Oct 27 13:56:17 2009
@@ -121,26 +121,50 @@
return g_table_size;
}
-void safe_lock(server_rec * s)
+void proctable_lock(request_rec *r)
+{
+ /* Lock error is a fatal error */
+ apr_status_t rv;
+
+ if ((rv = proctable_lock_internal()) != APR_SUCCESS) {
+ ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
+ "mod_fcgid: can't lock process table");
+ exit(1);
+ }
+}
+
+void proctable_unlock(request_rec *r)
+{
+ /* Lock error is a fatal error */
+ apr_status_t rv;
+
+ if ((rv = proctable_unlock_internal()) != APR_SUCCESS) {
+ ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
+ "mod_fcgid: can't unlock process table");
+ exit(1);
+ }
+}
+
+void proctable_pm_lock(server_rec * s)
{
/* Lock error is a fatal error */
apr_status_t rv;
if ((rv = proctable_lock_internal()) != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
- "mod_fcgid: can't get lock");
+ "mod_fcgid: can't lock process table in PM");
exit(1);
}
}
-void safe_unlock(server_rec * s)
+void proctable_pm_unlock(server_rec * s)
{
/* Lock error is a fatal error */
apr_status_t rv;
if ((rv = proctable_unlock_internal()) != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
- "mod_fcgid: can't unlock");
+ "mod_fcgid: can't unlock process table in PM");
exit(1);
}
}