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