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));
> >
> >
> >
> >
>

Reply via email to