You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by bj...@apache.org on 2001/02/06 16:16:06 UTC
cvs commit: httpd-2.0/server/mpm/spmt_os2 mpm.h mpm_default.h spmt_os2.c
bjh 01/02/06 07:16:06
Modified: include scoreboard.h
server scoreboard.c
server/mpm/spmt_os2 mpm.h mpm_default.h spmt_os2.c
Log:
Get OS/2 MPM running again after the reunification of the scoreboard code.
mod_status still doesn't work right, I'll look into that next.
Revision Changes Path
1.5 +8 -0 httpd-2.0/include/scoreboard.h
Index: scoreboard.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/scoreboard.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- scoreboard.h 2001/02/02 21:32:30 1.4
+++ scoreboard.h 2001/02/06 15:16:03 1.5
@@ -70,8 +70,10 @@
#include <time.h>
#endif
+#include "mpm.h" /* For MPM type */
#include "mpm_default.h" /* For HARD_.*_LIMIT */
#include "apr_thread_proc.h"
+#include "apr_portable.h"
/*The optimized timeout code only works if we're not using a scoreboard file*/
#if defined(AP_USE_MEM_BASED_SCOREBOARD)
@@ -154,6 +156,7 @@
unsigned short timeout_len; /* length of the timeout */
#endif
int thread_num;
+ apr_os_thread_t tid;
unsigned char status;
unsigned long access_count;
unsigned long bytes_served;
@@ -168,6 +171,11 @@
#endif
#ifndef OPTIMIZE_TIMEOUTS
time_t last_used;
+#endif
+#ifdef SPMT_OS2_MPM
+ apr_wait_t thread_retval;
+ char deferred_die;
+ ap_generation_t generation; /* generation of this thread */
#endif
char client[32]; /* Keep 'em small... */
char request[64]; /* We just want an idea... */
1.5 +1 -1 httpd-2.0/server/scoreboard.c
Index: scoreboard.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/scoreboard.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- scoreboard.c 2001/02/03 00:32:20 1.4
+++ scoreboard.c 2001/02/06 15:16:04 1.5
@@ -65,7 +65,7 @@
#include "http_core.h"
#include "http_config.h"
/* ToDo: Fix this right */
-#ifndef WIN32
+#if !defined(WIN32) && !defined(OS2)
#include "unixd.h"
#endif
1.5 +1 -0 httpd-2.0/server/mpm/spmt_os2/mpm.h
Index: mpm.h
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/spmt_os2/mpm.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- mpm.h 2000/07/27 00:04:11 1.4
+++ mpm.h 2001/02/06 15:16:05 1.5
@@ -67,5 +67,6 @@
extern char ap_coredump_dir[MAX_STRING_LEN];
extern server_rec *ap_server_conf;
+extern int ap_threads_per_child;
#endif /* APACHE_MPM_SPMT_OS2_H */
1.5 +8 -2 httpd-2.0/server/mpm/spmt_os2/mpm_default.h
Index: mpm_default.h
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/spmt_os2/mpm_default.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- mpm_default.h 2000/03/31 09:05:11 1.4
+++ mpm_default.h 2001/02/06 15:16:05 1.5
@@ -80,6 +80,9 @@
#define DEFAULT_MIN_FREE_DAEMON 5
#endif
+/* SPMT_OS2 only ever has 1 process */
+#define HARD_SERVER_LIMIT 1
+
/* Limit on the total --- clients will be locked out if more servers than
* this are needed. It is intended solely to keep the server from crashing
* when things get out of hand.
@@ -91,8 +94,8 @@
* enough that we can read the whole thing without worrying too much about
* the overhead.
*/
-#ifndef HARD_SERVER_LIMIT
-#define HARD_SERVER_LIMIT 256
+#ifndef HARD_THREAD_LIMIT
+#define HARD_THREAD_LIMIT 256
#endif
/* Where the main/parent process's pid is logged */
@@ -113,5 +116,8 @@
#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD
#define DEFAULT_MAX_REQUESTS_PER_CHILD 10000
#endif
+
+/* AP_CHILD_THREAD_FROM_ID is used by the scoreboard. */
+#define AP_CHILD_THREAD_FROM_ID(i) 0, i
#endif /* AP_MPM_DEFAULT_H */
1.76 +52 -166 httpd-2.0/server/mpm/spmt_os2/spmt_os2.c
Index: spmt_os2.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/spmt_os2/spmt_os2.c,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -r1.75 -r1.76
--- spmt_os2.c 2001/02/05 15:04:32 1.75
+++ spmt_os2.c 2001/02/06 15:16:05 1.76
@@ -90,7 +90,6 @@
static int ap_daemons_min_free=0;
static int ap_daemons_max_free=0;
static int ap_daemons_limit=0;
-static apr_time_t ap_restart_time=0;
static int ap_extended_status = 0;
/*
@@ -99,6 +98,8 @@
* value to optimize routines that have to scan the entire scoreboard.
*/
static int max_daemons_limit = -1;
+int ap_threads_per_child = HARD_THREAD_LIMIT;
+ap_generation_t volatile ap_my_generation=0; /* Used by the scoreboard */
char ap_coredump_dir[MAX_STRING_LEN];
@@ -120,10 +121,9 @@
static int one_process = 0;
static apr_pool_t *pconf; /* Pool for config stuff */
-static scoreboard *ap_scoreboard_image = NULL;
struct thread_globals {
- int child_num;
+ int thread_num;
apr_pool_t *pchild; /* Pool for httpd child stuff */
int usr1_just_die;
};
@@ -133,28 +133,6 @@
#define THREAD_GLOBAL(gvar) ((*ppthread_globals)->gvar)
-void reinit_scoreboard(apr_pool_t *p)
-{
- if (ap_scoreboard_image == NULL) {
- ap_scoreboard_image = (scoreboard *) malloc(SCOREBOARD_SIZE);
-
- if (ap_scoreboard_image == NULL) {
- ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
- "Ouch! Out of memory reiniting scoreboard!");
- }
- }
-
- memset(ap_scoreboard_image, 0, SCOREBOARD_SIZE);
-}
-
-void cleanup_scoreboard(void)
-{
- ap_assert(ap_scoreboard_image);
- free(ap_scoreboard_image);
- ap_scoreboard_image = NULL;
-}
-
-
/* a clean exit from a child with proper cleanup */
static void clean_child_exit(int code)
{
@@ -162,7 +140,7 @@
apr_destroy_pool(THREAD_GLOBAL(pchild));
}
- ap_scoreboard_image->servers[THREAD_GLOBAL(child_num)].thread_retval = code;
+ ap_scoreboard_image->servers[0][THREAD_GLOBAL(thread_num)].thread_retval = code;
_endthread();
}
@@ -234,111 +212,17 @@
#define SAFE_ACCEPT(stmt) do {stmt;} while(0)
#endif
-AP_DECLARE(int) ap_exists_scoreboard_image(void)
-{
- return (ap_scoreboard_image ? 1 : 0);
-}
-
AP_DECLARE(int) ap_get_max_daemons(void)
{
return max_daemons_limit;
}
-
-int ap_update_child_status(int child_num, int status, request_rec *r)
-{
- int old_status;
- short_score *ss;
-
- if (child_num < 0)
- return -1;
-
- ss = &ap_scoreboard_image->servers[child_num];
- old_status = ss->status;
- ss->status = status;
-
- if (ap_extended_status) {
- if (status == SERVER_READY || status == SERVER_DEAD) {
- /*
- * Reset individual counters
- */
- if (status == SERVER_DEAD) {
- ss->my_access_count = 0L;
- ss->my_bytes_served = 0L;
- }
- ss->conn_count = (unsigned short) 0;
- ss->conn_bytes = (unsigned long) 0;
- }
- if (r) {
- conn_rec *c = r->connection;
- apr_cpystrn(ss->client, ap_get_remote_host(c, r->per_dir_config,
- REMOTE_NOLOOKUP), sizeof(ss->client));
- if (r->the_request == NULL) {
- apr_cpystrn(ss->request, "NULL", sizeof(ss->request));
- } else if (r->parsed_uri.password == NULL) {
- apr_cpystrn(ss->request, r->the_request, sizeof(ss->request));
- } else {
- /* Don't reveal the password in the server-status view */
- apr_cpystrn(ss->request, apr_pstrcat(r->pool, r->method, " ",
- ap_unparse_uri_components(r->pool, &r->parsed_uri, UNP_OMITPASSWORD),
- r->assbackwards ? NULL : " ", r->protocol, NULL),
- sizeof(ss->request));
- }
- ss->vhostrec = r->server;
- }
- }
-
- if (status == SERVER_STARTING && r == NULL) {
- /* clean up the slot's vhostrec pointer (maybe re-used)
- * and mark the slot as belonging to a new generation.
- */
- ss->vhostrec = NULL;
- ap_scoreboard_image->parent[child_num].generation = ap_scoreboard_image->global.running_generation;
- }
-
- return old_status;
-}
-void ap_time_process_request(int child_num, int status)
+static int find_thread_by_tid(int tid)
{
- short_score *ss;
-
- if (child_num < 0)
- return;
-
- ss = &ap_scoreboard_image->servers[child_num];
-
- if (status == START_PREQUEST) {
- ss->start_time = apr_now();
- }
- else if (status == STOP_PREQUEST) {
- ss->stop_time = apr_now();
- }
-}
-
-/* TODO: call me some time */
-static void increment_counts(int child_num, request_rec *r)
-{
- short_score *ss;
-
- ss = &ap_scoreboard_image->servers[child_num];
-
-#ifdef HAVE_TIMES
- times(&ss->times);
-#endif
- ss->access_count++;
- ss->my_access_count++;
- ss->conn_count++;
- ss->bytes_served += r->bytes_sent;
- ss->my_bytes_served += r->bytes_sent;
- ss->conn_bytes += r->bytes_sent;
-}
-
-static int find_child_by_tid(int tid)
-{
int i;
for (i = 0; i < max_daemons_limit; ++i)
- if (ap_scoreboard_image->parent[i].tid == tid)
+ if (ap_scoreboard_image->servers[0][i].tid == tid)
return i;
return -1;
@@ -371,9 +255,9 @@
ret = DosWaitThread(&tid, DCWW_NOWAIT);
if (ret == 0) {
- int child_num = find_child_by_tid(tid);
- ap_assert( child_num > 0 );
- *status = ap_scoreboard_image->servers[child_num].thread_retval;
+ int thread_num = find_thread_by_tid(tid);
+ ap_assert( thread_num > 0 );
+ *status = ap_scoreboard_image->servers[0][thread_num].thread_retval;
return tid;
}
@@ -544,7 +428,7 @@
if (THREAD_GLOBAL(usr1_just_die)) {
just_die(sig);
}
- ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].deferred_die = 1;
+ ap_scoreboard_image->servers[0][THREAD_GLOBAL(thread_num)].deferred_die = 1;
}
/* volatile just in case */
@@ -684,15 +568,15 @@
AP_DECLARE(void) ap_child_terminate(request_rec *r)
{
r->connection->keepalive = 0;
- ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].deferred_die = 1;
+ ap_scoreboard_image->servers[0][THREAD_GLOBAL(thread_num)].deferred_die = 1;
}
int ap_graceful_stop_signalled(void)
{
- if (ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].deferred_die ||
- ap_scoreboard_image->global.running_generation != ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].generation) {
+ if (ap_scoreboard_image->servers[0][THREAD_GLOBAL(thread_num)].deferred_die ||
+ ap_scoreboard_image->global.running_generation != ap_scoreboard_image->servers[0][THREAD_GLOBAL(thread_num)].generation) {
return 1;
}
return 0;
@@ -703,8 +587,8 @@
int ap_stop_signalled(void)
{
if (shutdown_pending || restart_pending ||
- ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].deferred_die ||
- ap_scoreboard_image->global.running_generation != ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].generation) {
+ ap_scoreboard_image->servers[0][THREAD_GLOBAL(thread_num)].deferred_die ||
+ ap_scoreboard_image->global.running_generation != ap_scoreboard_image->servers[0][THREAD_GLOBAL(thread_num)].generation) {
return 1;
}
return 0;
@@ -731,14 +615,13 @@
-static void child_main(void *child_num_arg)
+static void thread_main(void *thread_num_arg)
{
ap_listen_rec *lr = NULL;
ap_listen_rec *first_lr = NULL;
apr_pool_t *ptrans;
conn_rec *current_conn;
apr_pool_t *pchild;
- parent_score *sc_parent_rec;
int requests_this_child = 0;
apr_pollfd_t *listen_poll;
apr_socket_t *csd = NULL;
@@ -759,8 +642,7 @@
*/
apr_create_pool(&pchild, pconf);
*ppthread_globals = (struct thread_globals *)apr_palloc(pchild, sizeof(struct thread_globals));
- THREAD_GLOBAL(child_num) = (int)child_num_arg;
- sc_parent_rec = ap_scoreboard_image->parent + THREAD_GLOBAL(child_num);
+ THREAD_GLOBAL(thread_num) = (int)thread_num_arg;
THREAD_GLOBAL(pchild) = pchild;
apr_create_pool(&ptrans, pchild);
@@ -773,7 +655,7 @@
ap_child_init_hook(pchild, ap_server_conf);
- (void) ap_update_child_status(THREAD_GLOBAL(child_num), SERVER_READY, (request_rec *) NULL);
+ (void) ap_update_child_status(0, THREAD_GLOBAL(thread_num), SERVER_READY, (request_rec *) NULL);
signal(SIGHUP, just_die);
@@ -802,7 +684,7 @@
clean_child_exit(0);
}
- (void) ap_update_child_status(THREAD_GLOBAL(child_num), SERVER_READY, (request_rec *) NULL);
+ (void) ap_update_child_status(0, THREAD_GLOBAL(thread_num), SERVER_READY, (request_rec *) NULL);
/*
* Wait for an acceptable connection to arrive.
@@ -935,11 +817,12 @@
ap_sock_disable_nagle(csd);
- (void) ap_update_child_status(THREAD_GLOBAL(child_num), SERVER_BUSY_READ,
+ (void) ap_update_child_status(0, THREAD_GLOBAL(thread_num), SERVER_BUSY_READ,
(request_rec *) NULL);
current_conn = ap_new_connection(ptrans, ap_server_conf, csd,
- THREAD_GLOBAL(child_num));
+ THREAD_GLOBAL(thread_num));
+
if (current_conn) {
ap_process_connection(current_conn);
ap_lingering_close(current_conn);
@@ -966,19 +849,19 @@
signal(SIGQUIT, SIG_DFL);
#endif
signal(SIGTERM, just_die);
- child_main((void *)slot);
+ thread_main((void *)slot);
*ppthread_globals = parent_globals;
}
- ap_update_child_status(slot, SERVER_STARTING, (request_rec *) NULL);
+ ap_update_child_status(0, slot, SERVER_STARTING, (request_rec *) NULL);
- if ((tid = _beginthread(child_main, NULL, 256*1024, (void *)slot)) == -1) {
+ if ((tid = _beginthread(thread_main, NULL, 256*1024, (void *)slot)) == -1) {
ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, s, "_beginthread: Unable to create new thread");
/* _beginthread didn't succeed. Fix the scoreboard or else
* it will say SERVER_STARTING forever and ever
*/
- (void) ap_update_child_status(slot, SERVER_DEAD, (request_rec *) NULL);
+ (void) ap_update_child_status(0, slot, SERVER_DEAD, (request_rec *) NULL);
/* In case system resources are maxxed out, we don't want
Apache running away with the CPU trying to _beginthread over and
@@ -988,7 +871,7 @@
return -1;
}
- ap_scoreboard_image->parent[slot].tid = tid;
+ ap_scoreboard_image->servers[0][slot].tid = tid;
return 0;
}
@@ -1000,7 +883,7 @@
time_t now = time(0);
for (i = 0; number_to_start && i < ap_daemons_limit; ++i) {
- if (ap_scoreboard_image->servers[i].status != SERVER_DEAD) {
+ if (ap_scoreboard_image->servers[0][i].status != SERVER_DEAD) {
continue;
}
if (make_child(ap_server_conf, i, now) < 0) {
@@ -1048,7 +931,7 @@
if (i >= max_daemons_limit && free_length == idle_spawn_rate)
break;
- ss = &ap_scoreboard_image->servers[i];
+ ss = &ap_scoreboard_image->servers[0][i];
status = ss->status;
if (status == SERVER_DEAD) {
/* try to keep children numbers as low as possible */
@@ -1085,7 +968,7 @@
* shut down gracefully, in case it happened to pick up a request
* while we were counting
*/
- ap_scoreboard_image->parent[to_kill].deferred_die = 1;
+ ap_scoreboard_image->servers[0][to_kill].deferred_die = 1;
idle_spawn_rate = 1;
}
else if (idle_count < ap_daemons_min_free) {
@@ -1154,7 +1037,7 @@
SAFE_ACCEPT(accept_mutex_init(pconf));
if (!is_graceful) {
- reinit_scoreboard(pconf);
+ ap_create_scoreboard(pconf, SB_NOT_SHARED);
}
set_signals();
@@ -1201,8 +1084,10 @@
"Server built: %s", ap_get_server_built());
restart_pending = shutdown_pending = 0;
+ printf("%s \n", ap_get_server_version());
+
while (!restart_pending && !shutdown_pending) {
- int child_slot;
+ int thread_slot;
apr_wait_t status;
int tid = wait_or_timeout(&status);
@@ -1215,16 +1100,16 @@
dummyproc.pid = tid;
ap_process_child_status(&dummyproc, status);
/* non-fatal death... note that it's gone in the scoreboard. */
- child_slot = find_child_by_tid(tid);
- if (child_slot >= 0) {
- (void) ap_update_child_status(child_slot, SERVER_DEAD,
+ thread_slot = find_thread_by_tid(tid);
+ if (thread_slot >= 0) {
+ (void) ap_update_child_status(0, thread_slot, SERVER_DEAD,
(request_rec *) NULL);
if (remaining_children_to_start
- && child_slot < ap_daemons_limit) {
+ && thread_slot < ap_daemons_limit) {
/* we're still doing a 1-for-1 replacement of dead
* children with new children
*/
- make_child(ap_server_conf, child_slot, time(0));
+ make_child(ap_server_conf, thread_slot, time(0));
--remaining_children_to_start;
}
#if APR_HAS_OTHER_CHILD
@@ -1281,8 +1166,8 @@
/* Kill off running threads */
for (slot=0; slot<max_daemons_limit; slot++) {
- if (ap_scoreboard_image->servers[slot].status != SERVER_DEAD) {
- tid = ap_scoreboard_image->parent[slot].tid;
+ if (ap_scoreboard_image->servers[0][slot].status != SERVER_DEAD) {
+ tid = ap_scoreboard_image->servers[0][slot].tid;
rc = DosKillThread(tid);
if (rc != ERROR_INVALID_THREADID) { // Already dead, ignore
@@ -1335,7 +1220,7 @@
/* kill off the idle ones */
for (i = 0; i < ap_daemons_limit; ++i) {
- ap_scoreboard_image->parent[i].deferred_die = 1;
+ ap_scoreboard_image->servers[0][i].deferred_die = 1;
}
/* This is mostly for debugging... so that we know what is still
@@ -1344,15 +1229,15 @@
* corruption too easily.
*/
for (i = 0; i < ap_daemons_limit; ++i) {
- if (ap_scoreboard_image->servers[i].status != SERVER_DEAD) {
- ap_scoreboard_image->servers[i].status = SERVER_GRACEFUL;
+ if (ap_scoreboard_image->servers[0][i].status != SERVER_DEAD) {
+ ap_scoreboard_image->servers[0][i].status = SERVER_GRACEFUL;
}
}
}
else {
/* Kill 'em off */
for (i = 0; i < ap_daemons_limit; ++i) {
- DosKillThread(ap_scoreboard_image->parent[i].tid);
+ DosKillThread(ap_scoreboard_image->servers[0][i].tid);
}
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, ap_server_conf,
"SIGHUP received. Attempting to restart");
@@ -1374,10 +1259,11 @@
ap_daemons_to_start = DEFAULT_START_DAEMON;
ap_daemons_min_free = DEFAULT_MIN_FREE_DAEMON;
ap_daemons_max_free = DEFAULT_MAX_FREE_DAEMON;
- ap_daemons_limit = HARD_SERVER_LIMIT;
+ ap_daemons_limit = HARD_THREAD_LIMIT;
ap_pid_fname = DEFAULT_PIDLOG;
ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD;
ap_extended_status = 0;
+ ap_scoreboard_fname = NULL;
apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir));
}
@@ -1455,17 +1341,17 @@
}
ap_daemons_limit = atoi(arg);
- if (ap_daemons_limit > HARD_SERVER_LIMIT) {
+ if (ap_daemons_limit > HARD_THREAD_LIMIT) {
ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
"WARNING: MaxClients of %d exceeds compile time limit "
- "of %d servers,", ap_daemons_limit, HARD_SERVER_LIMIT);
+ "of %d servers,", ap_daemons_limit, HARD_THREAD_LIMIT);
ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
" lowering MaxClients to %d. To increase, please "
- "see the", HARD_SERVER_LIMIT);
+ "see the", HARD_THREAD_LIMIT);
ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
- " HARD_SERVER_LIMIT define in %s.",
+ " HARD_THREAD_LIMIT define in %s.",
AP_MPM_HARD_LIMITS_FILE);
- ap_daemons_limit = HARD_SERVER_LIMIT;
+ ap_daemons_limit = HARD_THREAD_LIMIT;
}
else if (ap_daemons_limit < 1) {
ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,