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