Actually, this patch is not the only (or even main) culprit. The switch to use the
shared
scoreboard is fatally broken. I am in the process of keeping the spirit of Ryan's
patch to
only use pre_mpm in the parent and revert back to non shared scoreboard for Windows.
Bill
----- Original Message -----
From: "Bill Stoddard" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, February 04, 2002 11:57 AM
Subject: Fw: cvs commit: httpd-2.0/server/mpm/worker worker.c
> This patch seems to have broken restarts and child recovery on Windows.
Investigating...
>
> Bill
>
>
> > rbb 02/01/30 14:35:57
> >
> > Modified: include scoreboard.h
> > server scoreboard.c
> > server/mpm/prefork prefork.c
> > server/mpm/winnt mpm_winnt.c
> > server/mpm/worker worker.c
> > Log:
> > Change the Windows MPM to only use the pre_mpm phase in the parent process.
> > The child processes use the child_init phase to reattach to the shared
> > memory. This makes Windows work like Unix, which should make it easier
> > for module authors to write portable modules.
> >
> > Revision Changes Path
> > 1.39 +3 -3 httpd-2.0/include/scoreboard.h
> >
> > Index: scoreboard.h
> > ===================================================================
> > RCS file: /home/cvs/httpd-2.0/include/scoreboard.h,v
> > retrieving revision 1.38
> > retrieving revision 1.39
> > diff -u -r1.38 -r1.39
> > --- scoreboard.h 28 Jan 2002 00:41:31 -0000 1.38
> > +++ scoreboard.h 30 Jan 2002 22:35:56 -0000 1.39
> > @@ -73,6 +73,7 @@
> > #include "apr_hooks.h"
> > #include "apr_thread_proc.h"
> > #include "apr_portable.h"
> > +#include "apr_shm.h"
> >
> > /* Scoreboard info on a process is, for now, kept very brief ---
> > * just status value and pid (the latter so that the caretaker process
> > @@ -113,8 +114,7 @@
> > */
> > typedef enum {
> > SB_NOT_SHARED = 1,
> > - SB_SHARED = 2, /* PARENT */
> > - SB_SHARED_CHILD = 3
> > + SB_SHARED = 2
> > } ap_scoreboard_e;
> >
> > #define SB_WORKING 0 /* The server is busy and the child is useful. */
> > @@ -185,7 +185,7 @@
> > AP_DECLARE(void) ap_increment_counts(ap_sb_handle_t *sbh, request_rec *r);
> >
> > int ap_create_scoreboard(apr_pool_t *p, ap_scoreboard_e t);
> > -apr_status_t reopen_scoreboard(apr_pool_t *p, int detached);
> > +apr_status_t ap_reopen_scoreboard(apr_pool_t *p, apr_shm_t **shm, int detached);
> > void ap_init_scoreboard(void *shared_score);
> > int ap_calc_scoreboard_size(void);
> > apr_status_t ap_cleanup_scoreboard(void *d);
> >
> >
> >
> > 1.53 +9 -17 httpd-2.0/server/scoreboard.c
> >
> > Index: scoreboard.c
> > ===================================================================
> > RCS file: /home/cvs/httpd-2.0/server/scoreboard.c,v
> > retrieving revision 1.52
> > retrieving revision 1.53
> > diff -u -r1.52 -r1.53
> > --- scoreboard.c 28 Jan 2002 00:41:31 -0000 1.52
> > +++ scoreboard.c 30 Jan 2002 22:35:56 -0000 1.53
> > @@ -143,7 +143,8 @@
> > {
> > char *more_storage;
> > int i;
> > -
> > +
> > + ap_calc_scoreboard_size();
> > ap_scoreboard_image =
> > calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *));
> > more_storage = shared_score;
> > @@ -200,7 +201,7 @@
> > /* If detach is non-zero, this is a seperate child process,
> > * if zero, it is a forked child.
> > */
> > -apr_status_t reopen_scoreboard(apr_pool_t *p, int detached)
> > +apr_status_t ap_reopen_scoreboard(apr_pool_t *p, apr_shm_t **shm, int detached)
> > {
> > #if APR_HAS_SHARED_MEMORY
> > if (!detached) {
> > @@ -215,6 +216,9 @@
> > }
> > /* everything will be cleared shortly */
> > #endif
> > + if (*shm) {
> > + *shm = ap_scoreboard_shm;
> > + }
> > return APR_SUCCESS;
> > }
> >
> > @@ -260,14 +264,6 @@
> > memset(sb_shared, 0, scoreboard_size);
> > ap_init_scoreboard(sb_shared);
> > }
> > - else if (sb_type == SB_SHARED_CHILD) {
> > - void *sb_shared;
> > - rv = reopen_scoreboard(p, 1);
> > - if (rv || !(sb_shared = apr_shm_baseaddr_get(ap_scoreboard_shm))) {
> > - return HTTP_INTERNAL_SERVER_ERROR;
> > - }
> > - ap_init_scoreboard(sb_shared);
> > - }
> > else
> > #endif
> > {
> > @@ -282,14 +278,10 @@
> > ap_init_scoreboard(sb_mem);
> > }
> > }
> > - /* can't just memset() */
> > - if (sb_type != SB_SHARED_CHILD) {
> > - ap_scoreboard_image->global->sb_type = sb_type;
> > - ap_scoreboard_image->global->running_generation = running_gen;
> > - apr_pool_cleanup_register(p, NULL, ap_cleanup_scoreboard,
> > - apr_pool_cleanup_null);
> > - }
> > + ap_scoreboard_image->global->sb_type = sb_type;
> > + ap_scoreboard_image->global->running_generation = running_gen;
> > ap_restart_time = apr_time_now();
> > + apr_pool_cleanup_register(p, NULL, ap_cleanup_scoreboard,
apr_pool_cleanup_null);
> > return OK;
> > }
> >
> >
> >
> >
> > 1.236 +1 -1 httpd-2.0/server/mpm/prefork/prefork.c
> >
> > Index: prefork.c
> > ===================================================================
> > RCS file: /home/cvs/httpd-2.0/server/mpm/prefork/prefork.c,v
> > retrieving revision 1.235
> > retrieving revision 1.236
> > diff -u -r1.235 -r1.236
> > --- prefork.c 29 Jan 2002 22:31:25 -0000 1.235
> > +++ prefork.c 30 Jan 2002 22:35:56 -0000 1.236
> > @@ -594,7 +594,7 @@
> > apr_pool_tag(ptrans, "transaction");
> >
> > /* needs to be done before we switch UIDs so we have permissions */
> > - reopen_scoreboard(pchild, 0);
> > + ap_reopen_scoreboard(pchild, NULL, 0);
> > SAFE_ACCEPT(accept_mutex_child_init(pchild));
> >
> > if (unixd_setup_child()) {
> >
> >
> >
> > 1.214 +29 -8 httpd-2.0/server/mpm/winnt/mpm_winnt.c
> >
> > Index: mpm_winnt.c
> > ===================================================================
> > RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/mpm_winnt.c,v
> > retrieving revision 1.213
> > retrieving revision 1.214
> > diff -u -r1.213 -r1.214
> > --- mpm_winnt.c 29 Jan 2002 19:02:04 -0000 1.213
> > +++ mpm_winnt.c 30 Jan 2002 22:35:57 -0000 1.214
> > @@ -67,6 +67,7 @@
> > #include "apr_getopt.h"
> > #include "apr_strings.h"
> > #include "apr_lib.h"
> > +#include "apr_shm.h"
> > #include "ap_mpm.h"
> > #include "ap_config.h"
> > #include "ap_listen.h"
> > @@ -281,6 +282,23 @@
> > }
> > }
> >
> > +static void winnt_child_init(apr_pool_t *pchild, struct server_rec
>*ap_server_conf)
> > +{
> > + void *sb_shared;
> > + int rv;
> > +
> > + rv = ap_reopen_scoreboard(pchild, &ap_scoreboard_shm, 1);
> > + if (rv || !(sb_shared = apr_shm_baseaddr_get(ap_scoreboard_shm))) {
> > + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL, "Looks like we're gonna die %d
>%x",
> rv, ap_scoreboard_shm);
> > + exit(APEXIT_INIT); /* XXX need to return an error from this function */
> > + }
> > + ap_init_scoreboard(sb_shared);
> > +
> > + ap_scoreboard_image->parent[0].pid = parent_pid;
> > + ap_scoreboard_image->parent[0].quiescing = 0;
> > +}
> > +
> > +
> > /*
> > * The Win32 call WaitForMultipleObjects will only allow you to wait for
> > * a maximum of MAXIMUM_WAIT_OBJECTS (current 64). Since the threading
> > @@ -994,7 +1012,14 @@
> > exit_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, exit_event_name);
> > ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, ap_server_conf,
> > "Child %d: exit_event_name = %s", my_pid, exit_event_name);
> > + /* Set up the scoreboard. */
> > + ap_my_generation = atoi(getenv("AP_MY_GENERATION"));
> > + ap_log_error(APLOG_MARK, APLOG_CRIT, APR_SUCCESS, ap_server_conf,
> > + "getting listeners child_main", my_pid);
> > + get_listeners_from_parent(ap_server_conf);
> > }
> > + ap_log_error(APLOG_MARK, APLOG_CRIT, APR_SUCCESS, ap_server_conf,
> > + "in child_main", my_pid);
> >
> > /* Initialize the child_events */
> > max_requests_per_child_event = CreateEvent(NULL, TRUE, FALSE, NULL);
> > @@ -2117,7 +2142,6 @@
> > HANDLE sb_os_shm;
> > DWORD BytesRead;
> > apr_status_t rv;
> > -
> > pipe = GetStdHandle(STD_INPUT_HANDLE);
> > if (!ReadFile(pipe, &sb_os_shm, sizeof(sb_os_shm),
> > &BytesRead, (LPOVERLAPPED) NULL)
> > @@ -2135,18 +2159,14 @@
> > exit(1);
> > }
> >
> > - if (ap_run_pre_mpm(pconf, SB_SHARED_CHILD) != OK) {
> > - exit(1);
> > - }
> > +
> > ap_my_generation = atoi(getenv("AP_MY_GENERATION"));
> > - get_listeners_from_parent(ap_server_conf);
> > }
> > - ap_scoreboard_image->parent[0].pid = parent_pid;
> > - ap_scoreboard_image->parent[0].quiescing = 0;
> > -
> > +
> > if (!set_listeners_noninheritable(pconf)) {
> > return 1;
> > }
> > +
> > child_main();
> >
> > ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, ap_server_conf,
> > @@ -2195,6 +2215,7 @@
> > {
> > ap_hook_pre_config(winnt_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
> > ap_hook_post_config(winnt_post_config, NULL, NULL, 0);
> > + ap_hook_child_init(winnt_child_init, NULL, NULL, APR_HOOK_MIDDLE);
> > }
> >
> > /*
> >
> >
> >
> > 1.69 +1 -1 httpd-2.0/server/mpm/worker/worker.c
> >
> > Index: worker.c
> > ===================================================================
> > RCS file: /home/cvs/httpd-2.0/server/mpm/worker/worker.c,v
> > retrieving revision 1.68
> > retrieving revision 1.69
> > diff -u -r1.68 -r1.69
> > --- worker.c 30 Jan 2002 11:56:26 -0000 1.68
> > +++ worker.c 30 Jan 2002 22:35:57 -0000 1.69
> > @@ -874,7 +874,7 @@
> > apr_pool_create(&pchild, pconf);
> >
> > /*stuff to do before we switch id's, so we have permissions.*/
> > - reopen_scoreboard(pchild, 0);
> > + ap_reopen_scoreboard(pchild, NULL, 0);
> >
> > rv = SAFE_ACCEPT(apr_proc_mutex_child_init(&accept_mutex, ap_lock_fname,
> > pchild));
> >
> >
> >
> >
>