You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by st...@hyperreal.org on 1999/08/06 00:05:49 UTC

cvs commit: apache-2.0/mpm/src/modules/mpm/winnt winnt.c

stoddard    99/08/05 15:05:49

  Modified:    mpm/src/modules/mpm/winnt winnt.c
  Log:
  A few more hacks before taking off for the weekend.
  
  Revision  Changes    Path
  1.2       +37 -46    apache-2.0/mpm/src/modules/mpm/winnt/winnt.c
  
  Index: winnt.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/winnt/winnt.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- winnt.c	1999/08/05 21:08:25	1.1
  +++ winnt.c	1999/08/05 22:05:47	1.2
  @@ -1274,19 +1274,16 @@
   
   static int master_main(server_rec *s, HANDLE shutdown_event, HANDLE restart_event)
   {
  -    int remaining_children_to_start;
  -
  -    int child_num = 0;
  +    int remaining_children_to_start = ap_daemons_to_start;
  +    int i;
       int rv, cld;
  -    HANDLE process_handles[MAX_PROCESSES];
  -    HANDLE process_kill_events[MAX_PROCESSES];
  +    int child_num = 0;
  +    int restart_pending = 0;
  +    int shutdown_pending = 0;
       int current_live_processes = 0; /* number of child process we know about */
  -    int processes_to_create = 0;    /* number of child processes to create */
  -    pool *pparent = NULL;  /* pool for the parent process. Cleaned on each restart */
   
  -    restart_pending = shutdown_pending = 0;
  -
  -    remaining_children_to_start = ap_daemons_to_start;
  +    HANDLE process_handles[MAX_PROCESSES];
  +    HANDLE process_kill_events[MAX_PROCESSES];
   
       /* Create child process 
        * Should only be one in this version of Apache for WIN32 
  @@ -1309,23 +1306,20 @@
       process_handles[current_live_processes+1] = restart_event;
       rv = WaitForMultipleObjects(current_live_processes+2, (HANDLE *)process_handles, 
                                   FALSE, INFINITE);
  +    cld = rv - WAIT_OBJECT_0;
       if (rv == WAIT_FAILED) {
           /* Something serious is wrong */
           ap_log_error(APLOG_MARK,APLOG_CRIT|APLOG_WIN32ERROR, server_conf,
                        "master_main: : WaitForMultipeObjects on process handles and apache-signal -- doing shutdown");
           shutdown_pending = 1;
  -        break;
       }
  -    if (rv == WAIT_TIMEOUT) {
  +    else if (rv == WAIT_TIMEOUT) {
           /* Hey, this cannot happen */
           ap_log_error(APLOG_MARK, APLOG_ERR, s,
                        "master_main: WaitForMultipeObjects with INFINITE wait exited with WAIT_TIMEOUT");
           shutdown_pending = 1;
       }
  -    
  -    cld = rv - WAIT_OBJECT_0;
  -//        APD4("main process: wait finished, cld=%d handle %d (max=%d)", cld, process_handles[cld], current_live_processes);
  -    if (cld == current_live_processes) {
  +    else if (cld == current_live_processes) {
           /* shutdown_event signalled */
           shutdown_pending = 1;
           ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, s, 
  @@ -1341,8 +1335,8 @@
                   ap_log_error(APLOG_MARK,APLOG_ERR|APLOG_WIN32ERROR, server_conf,
                                "master_main: SetEvent for child process in slot #%d failed", i);
           }
  -        break;
  -    } else if (cld == current_live_processes+1) {
  +    } 
  +    else if (cld == current_live_processes+1) {
           /* restart_event signalled */
           int children_to_kill = current_live_processes;
           restart_pending = 1;
  @@ -1352,40 +1346,41 @@
               ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, s,
                            "master_main: ResetEvent(restart_event) failed.");
           }
  -        /* Signal each child process to die */
  +        /* Signal each child process to die 
  +         * We are making a big assumption here that the child process, once signaled,
  +         * will REALLY go away. Since this is a restart, we do not want to hold the 
  +         * new child process up waiting for the old child to die. Remove the old 
  +         * child out of the process_handles table and hope for the best...
  +         */
           for (i = 0; i < children_to_kill; i++) {
  -//                APD3("master_main: signalling child #%d handle %d to die", i, process_handles[i]);
  +            /* APD3("master_main: signalling child #%d handle %d to die", i, process_handles[i]); */
               if (SetEvent(process_kill_events[i]) == 0)
                   ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, s,
                                "master_main: SetEvent for child process in slot #%d failed", i);
  -            /* Remove the process (and event) from the process table */
               cleanup_process(process_handles, process_kill_events, i, &current_live_processes);
           }
  -        processes_to_create = ap_daemons_to_start;
  -    } else {
  +    } 
  +    else {
           /* A child process must have exited because of MaxRequestPerChild being hit
            * or a fatal error condition (seg fault, etc.). Remove the dead process 
            * from the process_handles and process_kill_events table and create a new
            * child process.
            * TODO: Consider restarting the child immediately without looping through http_main
  -         * This will become necesasary if we ever support multiple children.
  -         * One option, create a parent thread which waits on child death and restarts it.
  +         * and without rereading the configuration. Will need this if we ever support multiple 
  +         * children. One option, create a parent thread which waits on child death and restarts it.
            */
  +        restart_pending = 1;
           ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, server_conf, 
                        "master_main: Child processed exited (due to MaxRequestsPerChild?). Restarting the child process.");
           ap_assert(cld < current_live_processes);
           cleanup_process(process_handles, process_kill_events, cld, &current_live_processes);
  -//            APD2("main_process: child in slot %d died", rv);
  -        remaining_children_to_start = 1;
  -        continue;
  +        /* APD2("main_process: child in slot %d died", rv); */
  +        /* restart_child(process_hancles, process_kill_events, cld, &current_live_processes); */
       }
   
  -    /* If we dropped out of the loop we definitly want to die completely. We need to
  -     * make sure we wait for all the child process to exit first.
  -     */
   die_now:
       if (shutdown_pending) {
  -        tmstart = time(NULL);
  +        int tmstart = time(NULL);
           while (current_live_processes && ((tmstart+60) > time(NULL))) {
               rv = WaitForMultipleObjects(current_live_processes, (HANDLE *)process_handles, FALSE, 2000);
               if (rv == WAIT_TIMEOUT)
  @@ -1402,17 +1397,10 @@
                            "forcing termination of child #%d (handle %d)", i, process_handles[i]);
               TerminateProcess((HANDLE) process_handles[i], 1);
           }
  -
  +        return (0); /* Tell the caller we are shutting down */
       }
  -
  -    CloseHandle(restart_event);
  -    CloseHandle(shutdown_event);
   
  -    if (pparent) {
  -	ap_destroy_pool(pparent);
  -    }
  -
  -    return (0);
  +    return (1); /* Tell the call we want a restart */
   }
   
   /* 
  @@ -1438,7 +1426,7 @@
       }
   
       ap_listen_pre_config();
  -    ap_daemons_to_start = DEFAULT_NUM_DAEMON
  +    ap_daemons_to_start = DEFAULT_NUM_DAEMON;
       ap_threads_per_child = DEFAULT_START_THREAD;
       mpm_pid_fname = DEFAULT_PIDLOG;
       max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD;
  @@ -1460,7 +1448,6 @@
       int child_num;
       char* exit_event_name;
   
  -//    char signal_prefix_string[100];
       int i;
       time_t tmstart;
       HANDLE shutdown_event;	/* used to signal shutdown to parent */
  @@ -1541,10 +1528,14 @@
                                pidfile, (long)getpid());
               ap_destroy_mutex(start_mutex);
   
  +            CloseHandle(restart_event);
  +            CloseHandle(shutdown_event);
  +
               /* service_set_status(SERVICE_STOPPED); */
           }
  -
  -    return !restart;
  +        return !restart;
  +    }
  +    return (0);
   }
   
   static void winnt_hooks(void)
  @@ -1565,7 +1556,7 @@
       ap_hook_http_method(xxx,NULL,NULL,HOOK_REALLY_LAST);
       ap_hook_default_port(xxx,NULL,NULL,HOOK_REALLY_LAST);
   
  -    /* FIXME: I suspect we can eliminate the need for these - Ben */
  +    // FIXME: I suspect we can eliminate the need for these - Ben
       ap_hook_type_checker(xxx,NULL,NULL,HOOK_REALLY_LAST);
   */
   }