manoj 99/02/14 23:43:58
Modified: pthreads/src/modules/standard mod_status.c Log: Started fixing up mod_status to deal with threads. All this does is add an extra nested loop for the different threads in each process. There is probably a better way to do this, but it works, and it has helped me find another bug. Revision Changes Path 1.4 +36 -20 apache-apr/pthreads/src/modules/standard/mod_status.c Index: mod_status.c =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/modules/standard/mod_status.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -u -r1.3 -r1.4 --- mod_status.c 1999/02/10 21:06:54 1.3 +++ mod_status.c 1999/02/15 07:43:57 1.4 @@ -227,11 +227,10 @@ static int status_handler(request_rec *r) { -#if 0 char *loc; time_t nowtime = time(NULL); time_t up_time; - int i, res; + int i, j, res; int ready = 0; int busy = 0; unsigned long count = 0; @@ -250,10 +249,11 @@ #endif int short_report = 0; int no_table_report = 0; - short_score score_record; + thread_score score_record; parent_score ps_record; - char stat_buffer[HARD_SERVER_LIMIT]; + char stat_buffer[HARD_SERVER_LIMIT][HARD_THREAD_LIMIT]; int pid_buffer[HARD_SERVER_LIMIT]; + int tid_buffer[HARD_SERVER_LIMIT][HARD_THREAD_LIMIT]; clock_t tu, ts, tcu, tcs; server_rec *vhost; @@ -306,12 +306,15 @@ if (r->header_only) return 0; + ap_sync_scoreboard_image(); for (i = 0; i < HARD_SERVER_LIMIT; ++i) { - score_record = ap_scoreboard_image->servers[i]; + for (j = 0; j < HARD_THREAD_LIMIT; ++j) { + score_record = ap_scoreboard_image->servers[i][j]; ps_record = ap_scoreboard_image->parent[i]; res = score_record.status; - stat_buffer[i] = status_flags[res]; + stat_buffer[i][j] = status_flags[res]; pid_buffer[i] = (int) ps_record.pid; + tid_buffer[i][j] = (int) score_record.tid; if (res == SERVER_READY) ready++; else if (res != SERVER_DEAD) @@ -335,9 +338,12 @@ } } } + } up_time = nowtime - ap_restart_time; + /* ap_hard_timeout("send status info", r); */ + if (!short_report) { ap_rputs("<HTML><HEAD>\n<TITLE>Apache Status</TITLE>\n</HEAD><BODY>\n", r); ap_rputs("<H1>Apache Server Status for ", r); @@ -431,10 +437,12 @@ ap_rputs("Scoreboard: ", r); for (i = 0; i < HARD_SERVER_LIMIT; ++i) { - ap_rputc(stat_buffer[i], r); + for (j = 0; j < HARD_THREAD_LIMIT; ++j) { + ap_rputc(stat_buffer[i][j], r); if ((i % STATUS_MAXLINE == (STATUS_MAXLINE - 1)) && !short_report) ap_rputs("\n", r); } + } if (short_report) ap_rputs("\n", r); @@ -452,20 +460,22 @@ ap_rputs("\"<B><code>.</code></B>\" Open slot with no current process<P>\n", r); ap_rputs("<P>\n", r); if (!ap_extended_status) { - int j = 0; + int k = 0; ap_rputs("PID Key: <br>\n", r); ap_rputs("<PRE>\n", r); for (i = 0; i < HARD_SERVER_LIMIT; ++i) { - if (stat_buffer[i] != '.') { + for (j = 0; j < HARD_SERVER_LIMIT; ++j) { + if (stat_buffer[i][j] != '.') { ap_rprintf(r, " %d in state: %c ", pid_buffer[i], - stat_buffer[i]); - if (++j >= 3) { + stat_buffer[i][j]); + if (++k >= 3) { ap_rputs("\n", r); - j = 0; + k = 0; } else ap_rputs(",", r); } } + } ap_rputs("\n", r); ap_rputs("</PRE>\n", r); } @@ -478,14 +488,15 @@ else #ifdef NO_TIMES /* Allow for OS/2 not having CPU stats */ - ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>Acc<th>M\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r); + ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>TID<th>Acc<th>M\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r); #else - ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>Acc<th>M<th>CPU\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r); + ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>TID<th>Acc<th>M<th>CPU\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r); #endif } for (i = 0; i < HARD_SERVER_LIMIT; ++i) { - score_record = ap_scoreboard_image->servers[i]; + for (j = 0; j < HARD_THREAD_LIMIT; ++j) { + score_record = ap_scoreboard_image->servers[i][j]; ps_record = ap_scoreboard_image->parent[i]; vhost = score_record.vhostrec; if (ps_record.generation != ap_my_generation) { @@ -532,9 +543,10 @@ my_lres, lres); else ap_rprintf(r, - "<b>Server %d-%d</b> (%d): %d|%lu|%lu [", + "<b>Server %d-%d</b> (pid: %d, tid: %d): %d|%lu|%lu [", i, (int) ps_record.generation, (int) ps_record.pid, + (int) score_record.tid, (int) conn_lres, my_lres, lres); switch (score_record.status) { @@ -600,14 +612,14 @@ else { /* !no_table_report */ if (score_record.status == SERVER_DEAD) ap_rprintf(r, - "<tr><td><b>%d-%d</b><td>-<td>%d/%lu/%lu", + "<tr><td><b>%d-%d</b><td>-<td>-<td>%d/%lu/%lu", i, (int) ps_record.generation, (int) conn_lres, my_lres, lres); else ap_rprintf(r, - "<tr><td><b>%d-%d</b><td>%d<td>%d/%lu/%lu", + "<tr><td><b>%d-%d</b><td>%d<td>%d<td>%d/%lu/%lu", i, (int) ps_record.generation, - (int) ps_record.pid, (int) conn_lres, + (int) ps_record.pid, (int) score_record.tid, (int) conn_lres, my_lres, lres); switch (score_record.status) { @@ -674,6 +686,7 @@ } /* !short_report */ } /* if (<active child>) */ } /* for () */ + } if (!(short_report || no_table_report)) { #ifdef NO_TIMES @@ -682,6 +695,7 @@ <table>\n \ <tr><th>Srv<td>Child Server number - generation\n \ <tr><th>PID<td>OS process ID\n \ +<tr><th>TID<td>OS thread ID\n \ <tr><th>Acc<td>Number of accesses this connection / this child / this slot\n \ <tr><th>M<td>Mode of operation\n \ <tr><th>SS<td>Seconds since beginning of most recent request\n \ @@ -696,6 +710,7 @@ <table>\n \ <tr><th>Srv<td>Child Server number - generation\n \ <tr><th>PID<td>OS process ID\n \ +<tr><th>TID<td>OS thread ID\n \ <tr><th>Acc<td>Number of accesses this connection / this child / this slot\n \ <tr><th>M<td>Mode of operation\n \ <tr><th>CPU<td>CPU usage, number of seconds\n \ @@ -719,7 +734,8 @@ ap_rputs(ap_psignature("<HR>\n",r), r); ap_rputs("</BODY></HTML>\n", r); } -#endif + + /* ap_kill_timeout(r); */ return 0; }