You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by rb...@apache.org on 2001/10/23 19:30:08 UTC

cvs commit: apr/threadproc/win32 proc.c

rbb         01/10/23 10:30:08

  Modified:    .        CHANGES
               include  mpm_common.h
               server   mpm_common.c
               server/mpm/beos beos.c
               server/mpm/perchild perchild.c
               server/mpm/prefork prefork.c
               server/mpm/threaded threaded.c
               server/mpm/worker worker.c
               .        CHANGES
               include  apr_thread_proc.h
               memory/unix apr_pools.c
               test     testproc.c testprocmutex.c testsock.c
               threadproc/beos proc.c
               threadproc/netware proc.c
               threadproc/os2 proc.c
               threadproc/unix proc.c
               threadproc/win32 proc.c
  Log:
  Fix the reporting for child processes that die.  This removes
  all of the non-portable W* macros from Apache.
  
  Submitted by:	Jeff Trawick and Ryan Bloom
  
  Revision  Changes    Path
  1.402     +5 -0      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.401
  retrieving revision 1.402
  diff -u -r1.401 -r1.402
  --- CHANGES	2001/10/23 17:13:26	1.401
  +++ CHANGES	2001/10/23 17:30:06	1.402
  @@ -1,4 +1,9 @@
   Changes with Apache 2.0.27-dev
  +
  +  *) Fix the reporting for child processes that die.  This removes
  +     all of the non-portable W* macros from Apache. 
  +     [Jeff Trawick and Ryan Bloom]
  +
     *) Win32: Track and display "Parent Server Generation:" in
        mod_status output. The generation will be bumped at
        server graceful restart, when the child process exits
  
  
  
  1.29      +3 -2      httpd-2.0/include/mpm_common.h
  
  Index: mpm_common.h
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/include/mpm_common.h,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- mpm_common.h	2001/08/14 12:30:49	1.28
  +++ mpm_common.h	2001/10/23 17:30:07	1.29
  @@ -125,7 +125,8 @@
    * @param p The pool to allocate out of
    */
   #ifdef AP_MPM_WANT_WAIT_OR_TIMEOUT
  -void ap_wait_or_timeout(apr_wait_t *status, apr_proc_t *ret, apr_pool_t *p);
  +void ap_wait_or_timeout(apr_exit_why_e *status, int *exitcode, apr_proc_t *ret, 
  +                        apr_pool_t *p);
   #endif
   
   /**
  @@ -135,7 +136,7 @@
    * @param status The status returned from ap_wait_or_timeout
    */
   #ifdef AP_MPM_WANT_PROCESS_CHILD_STATUS
  -void ap_process_child_status(apr_proc_t *pid, apr_wait_t status);
  +void ap_process_child_status(apr_proc_t *pid, apr_exit_why_e why, int status);
   #endif
   
   #if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF)
  
  
  
  1.70      +12 -14    httpd-2.0/server/mpm_common.c
  
  Index: mpm_common.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/mpm_common.c,v
  retrieving revision 1.69
  retrieving revision 1.70
  diff -u -r1.69 -r1.70
  --- mpm_common.c	2001/09/21 14:29:33	1.69
  +++ mpm_common.c	2001/10/23 17:30:07	1.70
  @@ -124,7 +124,7 @@
                   continue;
   
               proc.pid = pid;
  -            waitret = apr_proc_wait(&proc, NULL, APR_NOWAIT);
  +            waitret = apr_proc_wait(&proc, NULL, NULL, APR_NOWAIT);
               if (waitret != APR_CHILD_NOTDONE) {
                   MPM_NOTE_CHILD_KILLED(i);
                   continue;
  @@ -196,7 +196,8 @@
   #endif
   static int wait_or_timeout_counter;
   
  -void ap_wait_or_timeout(apr_wait_t *status, apr_proc_t *ret, apr_pool_t *p)
  +void ap_wait_or_timeout(apr_exit_why_e *status, int *exitcode, apr_proc_t *ret,
  +                        apr_pool_t *p)
   {
       apr_status_t rv;
   
  @@ -204,7 +205,7 @@
       if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) {
           wait_or_timeout_counter = 0;
       }
  -    rv = apr_proc_wait_all_procs(ret, status, APR_NOWAIT, p);
  +    rv = apr_proc_wait_all_procs(ret, exitcode, status, APR_NOWAIT, p);
       if (APR_STATUS_IS_EINTR(rv)) {
           ret->pid = -1;
           return;
  @@ -213,7 +214,7 @@
           return;
       }
   #ifdef NEED_WAITPID
  -    if ((ret = reap_children(status)) > 0) {
  +    if ((ret = reap_children(exitcode, status)) > 0) {
           return;
       }
   #endif
  @@ -224,16 +225,16 @@
   #endif /* AP_MPM_WANT_WAIT_OR_TIMEOUT */
   
   #ifdef AP_MPM_WANT_PROCESS_CHILD_STATUS
  -void ap_process_child_status(apr_proc_t *pid, apr_wait_t status)
  +void ap_process_child_status(apr_proc_t *pid, apr_exit_why_e why, int status)
   {
  -    int signum = WTERMSIG(status);
  +    int signum = status;
       const char *sigdesc = apr_signal_get_description(signum);
   
       /* Child died... if it died due to a fatal error,
           * we should simply bail out.
           */
  -    if ((WIFEXITED(status)) &&
  -        WEXITSTATUS(status) == APEXIT_CHILDFATAL) {
  +    if ((APR_PROC_CHECK_EXIT(why)) &&
  +        (status == APEXIT_CHILDFATAL)) {
           ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_NOERRNO, 0, ap_server_conf,
                           "Child %ld returned a Fatal error..." APR_EOL_STR
                           "Apache is exiting!",
  @@ -241,7 +242,7 @@
           exit(APEXIT_CHILDFATAL);
       }
   
  -    if (WIFSIGNALED(status)) {
  +    if (APR_PROC_CHECK_SIGNALED(why)) {
           switch (signum) {
           case SIGTERM:
           case SIGHUP:
  @@ -249,8 +250,7 @@
           case SIGKILL:
               break;
           default:
  -#ifdef WCOREDUMP
  -            if (WCOREDUMP(status)) {
  +            if (APR_PROC_CHECK_CORE_DUMP(why)) {
                   ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE,
                                0, ap_server_conf,
                                "child pid %ld exit signal %s (%d), "
  @@ -258,9 +258,7 @@
                                (long)pid->pid, sigdesc, signum,
                                ap_coredump_dir);
               }
  -            else
  -#endif
  -            {
  +            else {
                   ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE,
                                0, ap_server_conf,
                                "child pid %ld exit signal %s (%d)",
  
  
  
  1.63      +4 -3      httpd-2.0/server/mpm/beos/beos.c
  
  Index: beos.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/mpm/beos/beos.c,v
  retrieving revision 1.62
  retrieving revision 1.63
  diff -u -r1.62 -r1.63
  --- beos.c	2001/09/18 22:13:58	1.62
  +++ beos.c	2001/10/23 17:30:07	1.63
  @@ -597,16 +597,17 @@
   static void server_main_loop(int remaining_threads_to_start)
   {
       int child_slot;
  -    apr_wait_t status;
  +    apr_exit_why_e exitwhy;
  +    int status;
       apr_proc_t pid;
       int i;
   
       while (!restart_pending && !shutdown_pending) {
   
  -        ap_wait_or_timeout(&status, &pid, pconf);
  +        ap_wait_or_timeout(&exitwhy, &status, &pid, pconf);
            
           if (pid.pid >= 0) {
  -            ap_process_child_status(&pid, status);
  +            ap_process_child_status(&pid, exitwhy, status);
               /* non-fatal death... note that it's gone in the scoreboard. */
               child_slot = -1;
               for (i = 0; i < ap_max_child_assigned; ++i) {
  
  
  
  1.80      +4 -3      httpd-2.0/server/mpm/perchild/perchild.c
  
  Index: perchild.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/mpm/perchild/perchild.c,v
  retrieving revision 1.79
  retrieving revision 1.80
  diff -u -r1.79 -r1.80
  --- perchild.c	2001/09/18 22:13:58	1.79
  +++ perchild.c	2001/10/23 17:30:07	1.80
  @@ -1091,15 +1091,16 @@
   static void server_main_loop(int remaining_children_to_start)
   {
       int child_slot;
  -    apr_wait_t status;
  +    apr_exit_why exitwhy;
  +    int status;
       apr_proc_t pid;
       int i;
   
       while (!restart_pending && !shutdown_pending) {
  -        ap_wait_or_timeout(&status, &pid, pconf);
  +        ap_wait_or_timeout(&exitwhy, &status, &pid, pconf);
           
           if (pid.pid != -1) {
  -            ap_process_child_status(&pid, status);
  +            ap_process_child_status(&pid, exitwhy, status);
               /* non-fatal death... note that it's gone in the child table and
                * clean out the status table. */
               child_slot = -1;
  
  
  
  1.205     +7 -5      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.204
  retrieving revision 1.205
  diff -u -r1.204 -r1.205
  --- prefork.c	2001/10/16 18:45:16	1.204
  +++ prefork.c	2001/10/23 17:30:07	1.205
  @@ -369,7 +369,7 @@
      Systems without a real waitpid sometimes lose a child's exit while waiting
      for another.  Search through the scoreboard for missing children.
    */
  -int reap_children(apr_wait_t *status)
  +int reap_children(int *exitcode, apr_exit_why_e *status)
   {
       int n, pid;
   
  @@ -379,7 +379,8 @@
   		kill((pid = ap_scoreboard_image->parent[n].pid), 0) == -1) {
   	    ap_update_child_status(AP_CHILD_THREAD_FROM_ID(n), SERVER_DEAD, NULL);
   	    /* just mark it as having a successful exit status */
  -	    memset(status, 0, sizeof(apr_wait_t));
  +            *status = APR_PROC_EXIT;
  +            *exitcode = 0;
   	    return(pid);
   	}
       }
  @@ -1171,18 +1172,19 @@
   
       while (!restart_pending && !shutdown_pending) {
   	int child_slot;
  -	apr_wait_t status;
  +        apr_exit_why_e exitwhy;
  +	int status;
           /* this is a memory leak, but I'll fix it later. */
   	apr_proc_t pid;
   
  -        ap_wait_or_timeout(&status, &pid, pconf);
  +        ap_wait_or_timeout(&exitwhy, &status, &pid, pconf);
   
   	/* XXX: if it takes longer than 1 second for all our children
   	 * to start up and get into IDLE state then we may spawn an
   	 * extra child
   	 */
   	if (pid.pid != -1) {
  -	    ap_process_child_status(&pid, status);
  +	    ap_process_child_status(&pid, exitwhy, status);
   	    /* non-fatal death... note that it's gone in the scoreboard. */
   	    ap_sync_scoreboard_image();
   	    child_slot = find_child_by_pid(&pid);
  
  
  
  1.66      +4 -3      httpd-2.0/server/mpm/threaded/threaded.c
  
  Index: threaded.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/mpm/threaded/threaded.c,v
  retrieving revision 1.65
  retrieving revision 1.66
  diff -u -r1.65 -r1.66
  --- threaded.c	2001/10/16 04:02:28	1.65
  +++ threaded.c	2001/10/23 17:30:07	1.66
  @@ -1122,15 +1122,16 @@
   static void server_main_loop(int remaining_children_to_start)
   {
       int child_slot;
  -    apr_wait_t status;
  +    apr_exit_why_e exitwhy;
  +    int status;
       apr_proc_t pid;
       int i;
   
       while (!restart_pending && !shutdown_pending) {
  -        ap_wait_or_timeout(&status, &pid, pconf);
  +        ap_wait_or_timeout(&exitwhy, &status, &pid, pconf);
           
           if (pid.pid != -1) {
  -            ap_process_child_status(&pid, status);
  +            ap_process_child_status(&pid, exitwhy, status);
               /* non-fatal death... note that it's gone in the scoreboard. */
               child_slot = find_child_by_pid(&pid);
               if (child_slot >= 0) {
  
  
  
  1.31      +4 -3      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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- worker.c	2001/10/19 23:45:39	1.30
  +++ worker.c	2001/10/23 17:30:07	1.31
  @@ -1187,15 +1187,16 @@
   static void server_main_loop(int remaining_children_to_start)
   {
       int child_slot;
  -    apr_wait_t status;
  +    apr_exit_why_e exitwhy;
  +    int status;
       apr_proc_t pid;
       int i;
   
       while (!restart_pending && !shutdown_pending) {
  -        ap_wait_or_timeout(&status, &pid, pconf);
  +        ap_wait_or_timeout(&exitwhy, &status, &pid, pconf);
           
           if (pid.pid != -1) {
  -            ap_process_child_status(&pid, status);
  +            ap_process_child_status(&pid, exitwhy, status);
               /* non-fatal death... note that it's gone in the scoreboard. */
               child_slot = find_child_by_pid(&pid);
               if (child_slot >= 0) {
  
  
  
  1.175     +5 -0      apr/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apr/CHANGES,v
  retrieving revision 1.174
  retrieving revision 1.175
  diff -u -r1.174 -r1.175
  --- CHANGES	2001/10/19 23:27:57	1.174
  +++ CHANGES	2001/10/23 17:30:07	1.175
  @@ -1,5 +1,10 @@
   Changes with APR b1  
   
  +  *) Re-vamp the apr_proc_wait and apr_proc_wait_all functions.  We
  +     now return the exit code from the program and a reason that the
  +     program died, either normal exit or signalled.
  +     [Jeff Trawick and Ryan Bloom]
  +
     *) Implement portable accessors for proc mutex. These are equivalent
        to apr_os_lock_get/set, but they work for apr_proc_mutex_t types
        instead.   [Aaron Bannert]
  
  
  
  1.76      +39 -13    apr/include/apr_thread_proc.h
  
  Index: apr_thread_proc.h
  ===================================================================
  RCS file: /home/cvs/apr/include/apr_thread_proc.h,v
  retrieving revision 1.75
  retrieving revision 1.76
  diff -u -r1.75 -r1.76
  --- apr_thread_proc.h	2001/09/20 08:59:30	1.75
  +++ apr_thread_proc.h	2001/10/23 17:30:08	1.76
  @@ -81,6 +81,17 @@
   
   typedef enum {APR_SHELLCMD, APR_PROGRAM} apr_cmdtype_e;
   typedef enum {APR_WAIT, APR_NOWAIT} apr_wait_how_e;
  +/* I am specifically calling out the values so that the macros below make
  + * more sense.  Yes, I know I don't need to, but I am hoping this makes what
  + * I am doing more clear.  If you want to add more reasons to exit, continue
  + * to use bitmasks.
  + */
  +typedef enum {APR_PROC_EXIT = 1, APR_PROC_SIGNAL = 2, 
  +              APR_PROC_SIGNAL_CORE = 4} apr_exit_why_e;
  +
  +#define APR_PROC_CHECK_EXIT(x)        (x & APR_PROC_EXIT)
  +#define APR_PROC_CHECK_SIGNALED(x)    (x & APR_PROC_SIGNAL)
  +#define APR_PROC_CHECK_CORE_DUMP(x)   (x & APR_PROC_SIGNAL_CORE)
   
   #define APR_NO_PIPE          0
   #define APR_FULL_BLOCK       1
  @@ -481,11 +492,17 @@
   /**
    * Wait for a child process to die
    * @param proc The process handle that corresponds to the desired child process 
  - * @param exitcode The returned exit status of the child, if a child process
  - *                 dies. On platforms that don't support obtaining this
  - *                 information, the exitcode parameter will be returned as
  - *                 APR_ENOTIMPL. This parameter may be NULL if the exit code
  - *                 is not needed.
  + * @param exitcode The returned exit status of the child, if a child process 
  + *                 dies, or the signal that caused the child to die.
  + *                 On platforms that don't support obtaining this information, 
  + *                 the status parameter will be returned as APR_ENOTIMPL.
  + * @param exitwhy Why the child died, the bitwise or of:
  + * <PRE>
  + *            APR_PROC_EXIT         -- process terminated normally
  + *            APR_PROC_SIGNAL       -- process was killed by a signal
  + *            APR_PROC_SIGNAL_CORE  -- process was killed by a signal, and
  + *                                     generated a core dump.
  + * </PRE>
    * @param waithow How should we wait.  One of:
    * <PRE>
    *            APR_WAIT   -- block until the child process dies.
  @@ -498,8 +515,8 @@
    *            APR_CHILD_NOTDONE  -- child is still running.
    * </PRE>
    */
  -APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, 
  -                                        apr_wait_t *exitcode,
  +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
  +                                        int *exitcode, apr_exit_why_e *exitwhy,
                                           apr_wait_how_e waithow);
   
   /**
  @@ -507,9 +524,17 @@
    * about that child.
    * @param proc Pointer to NULL on entry, will be filled out with child's 
    *             information 
  - * @param status The returned exit status of the child, if a child process dies
  - *               On platforms that don't support obtaining this information, 
  - *               the status parameter will be returned as APR_ENOTIMPL.
  + * @param exitcode The returned exit status of the child, if a child process 
  + *                 dies, or the signal that caused the child to die.
  + *                 On platforms that don't support obtaining this information, 
  + *                 the status parameter will be returned as APR_ENOTIMPL.
  + * @param exitwhy Why the child died, the bitwise or of:
  + * <PRE>
  + *            APR_PROC_EXIT         -- process terminated normally
  + *            APR_PROC_SIGNAL       -- process was killed by a signal
  + *            APR_PROC_SIGNAL_CORE  -- process was killed by a signal, and
  + *                                     generated a core dump.
  + * </PRE>
    * @param waithow How should we wait.  One of:
    * <PRE>
    *            APR_WAIT   -- block until the child process dies.
  @@ -519,9 +544,10 @@
    * @param p Pool to allocate child information out of.
    */
   APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,
  -                                             apr_wait_t *status,
  -                                             apr_wait_how_e waithow,
  -                                             apr_pool_t *p);
  +                                                  int *exitcode,
  +                                                  apr_exit_why_e *exitwhy,
  +                                                  apr_wait_how_e waithow,
  +                                                  apr_pool_t *p);
   
   /**
    * Detach the process from the controlling terminal.
  
  
  
  1.114     +2 -2      apr/memory/unix/apr_pools.c
  
  Index: apr_pools.c
  ===================================================================
  RCS file: /home/cvs/apr/memory/unix/apr_pools.c,v
  retrieving revision 1.113
  retrieving revision 1.114
  diff -u -r1.113 -r1.114
  --- apr_pools.c	2001/09/28 15:22:35	1.113
  +++ apr_pools.c	2001/10/23 17:30:08	1.114
  @@ -1505,7 +1505,7 @@
   #ifndef NEED_WAITPID
       /* Pick up all defunct processes */
       for (p = procs; p; p = p->next) {
  -        if (apr_proc_wait(p->pid, NULL, APR_NOWAIT) != APR_CHILD_NOTDONE) {
  +        if (apr_proc_wait(p->pid, NULL, NULL, APR_NOWAIT) != APR_CHILD_NOTDONE) {
               p->kill_how = kill_never;
           }
       }
  @@ -1550,7 +1550,7 @@
       /* Now wait for all the signaled processes to die */
       for (p = procs; p; p = p->next) {
   	if (p->kill_how != kill_never) {
  -	    (void) apr_proc_wait(p->pid, NULL, APR_WAIT);
  +	    (void) apr_proc_wait(p->pid, NULL, NULL, APR_WAIT);
   	}
       }
   #ifdef WIN32
  
  
  
  1.33      +1 -1      apr/test/testproc.c
  
  Index: testproc.c
  ===================================================================
  RCS file: /home/cvs/apr/test/testproc.c,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- testproc.c	2001/09/20 09:03:24	1.32
  +++ testproc.c	2001/10/23 17:30:08	1.33
  @@ -142,7 +142,7 @@
       else printf( "Read failed.\n");
   
       TEST_NEQ("Waiting for child to die",
  -             apr_proc_wait(&newproc, NULL, APR_WAIT),
  +             apr_proc_wait(&newproc, NULL, NULL, APR_WAIT),
                APR_CHILD_DONE, "OK", "Failed")   
       STD_TEST_NEQ("Removing directory", apr_dir_remove("proctest", pool))
   
  
  
  
  1.5       +4 -4      apr/test/testprocmutex.c
  
  Index: testprocmutex.c
  ===================================================================
  RCS file: /home/cvs/apr/test/testprocmutex.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- testprocmutex.c	2001/09/24 05:37:28	1.4
  +++ testprocmutex.c	2001/10/23 17:30:08	1.5
  @@ -126,10 +126,10 @@
       printf("OK\n");
    
       printf("%-60s", "    Waiting for processes to exit");
  -    s1 = apr_proc_wait(p1, NULL, APR_WAIT);
  -    s2 = apr_proc_wait(p2, NULL, APR_WAIT);
  -    s3 = apr_proc_wait(p3, NULL, APR_WAIT);
  -    s4 = apr_proc_wait(p4, NULL, APR_WAIT);
  +    s1 = apr_proc_wait(p1, NULL, NULL, APR_WAIT);
  +    s2 = apr_proc_wait(p2, NULL, NULL, APR_WAIT);
  +    s3 = apr_proc_wait(p3, NULL, NULL, APR_WAIT);
  +    s4 = apr_proc_wait(p4, NULL, NULL, APR_WAIT);
       printf("OK\n");
    
       if ((*x) != MAX_COUNTER) {
  
  
  
  1.24      +8 -8      apr/test/testsock.c
  
  Index: testsock.c
  ===================================================================
  RCS file: /home/cvs/apr/test/testsock.c,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- testsock.c	2001/09/20 09:03:24	1.23
  +++ testsock.c	2001/10/23 17:30:08	1.24
  @@ -96,18 +96,18 @@
           exit(-1);
       }
   
  -    while ((s1 = apr_proc_wait(&proc1, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE && 
  -           (s2 = apr_proc_wait(&proc2, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE) {
  +    while ((s1 = apr_proc_wait(&proc1, NULL, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE && 
  +           (s2 = apr_proc_wait(&proc2, NULL, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE) {
           continue;
       }
   
       if (s1 == APR_SUCCESS) {
           apr_proc_kill(&proc2, SIGTERM);
  -        while (apr_proc_wait(&proc2, NULL, APR_WAIT) == APR_CHILD_NOTDONE);
  +        while (apr_proc_wait(&proc2, NULL, NULL, APR_WAIT) == APR_CHILD_NOTDONE);
       }
       else {
           apr_proc_kill(&proc1, SIGTERM);
  -        while (apr_proc_wait(&proc1, NULL, APR_WAIT) == APR_CHILD_NOTDONE);
  +        while (apr_proc_wait(&proc1, NULL, NULL, APR_WAIT) == APR_CHILD_NOTDONE);
       }
       fprintf(stdout, "Network test completed.\n");   
   
  @@ -163,18 +163,18 @@
           exit(-1);
       }
   
  -    while ((s1 = apr_proc_wait(&proc1, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE && 
  -           (s2 = apr_proc_wait(&proc2, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE) {
  +    while ((s1 = apr_proc_wait(&proc1, NULL, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE && 
  +           (s2 = apr_proc_wait(&proc2, NULL, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE) {
           continue;
       }
   
       if (s1 == APR_SUCCESS) {
           apr_proc_kill(&proc2, SIGTERM);
  -        while (apr_proc_wait(&proc2, NULL, APR_WAIT) == APR_CHILD_NOTDONE);
  +        while (apr_proc_wait(&proc2, NULL, NULL, APR_WAIT) == APR_CHILD_NOTDONE);
       }
       else {
           apr_proc_kill(&proc1, SIGTERM);
  -        while (apr_proc_wait(&proc1, NULL, APR_WAIT) == APR_CHILD_NOTDONE);
  +        while (apr_proc_wait(&proc1, NULL, NULL, APR_WAIT) == APR_CHILD_NOTDONE);
       }
       fprintf(stdout, "Network test completed.\n");   
   
  
  
  
  1.41      +6 -4      apr/threadproc/beos/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/beos/proc.c,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- proc.c	2001/09/20 08:59:30	1.40
  +++ proc.c	2001/10/23 17:30:08	1.41
  @@ -280,7 +280,9 @@
       return APR_SUCCESS;
   }
   
  -APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, apr_wait_t *status,
  +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,
  +                                                  int *exitcode,
  +                                                  apr_exit_why_e *exitwhy,
                                             apr_wait_how_e waithow, apr_pool_t *p)
   {
       int waitpid_options = WUNTRACED;
  @@ -298,9 +300,9 @@
       return errno;
   } 
   
  -APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, 
  -                                        apr_wait_t *exitcode,
  -                                        apr_wait_how_e wait)
  +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
  +                                        int *exitcode, apr_exit_why_e *exitwhy,
  +                                        apr_wait_how_e waithow)
   {
       status_t rv;
   
  
  
  
  1.3       +8 -5      apr/threadproc/netware/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/netware/proc.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- proc.c	2001/09/20 08:59:30	1.2
  +++ proc.c	2001/10/23 17:30:08	1.3
  @@ -372,8 +372,11 @@
       return APR_SUCCESS;
   }
   
  -apr_status_t apr_proc_wait_all_procs(apr_proc_t *proc, apr_wait_t *status,
  -                              apr_wait_how_e waithow, apr_pool_t *p)
  +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,
  +                                                  int *exitcode,
  +                                                  apr_exit_why_e *exitwhy,
  +                                                  apr_wait_how_e waithow,
  +                                                  apr_pool_t *p)
   {
   #if 0
       int waitpid_options = WUNTRACED;
  @@ -392,9 +395,9 @@
       return errno;
   } 
   
  -apr_status_t apr_proc_wait(apr_proc_t *proc, 
  -                           apr_wait_t *exitcode,
  -                           apr_wait_how_e waithow)
  +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
  +                                        int *exitcode, apr_exit_why_e *exitwhy,
  +                                        apr_wait_how_e waithow)
   {
   #if 0
       pid_t status;
  
  
  
  1.46      +7 -6      apr/threadproc/os2/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/os2/proc.c,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- proc.c	2001/09/20 08:59:30	1.45
  +++ proc.c	2001/10/23 17:30:08	1.46
  @@ -496,10 +496,11 @@
       return status;
   }
   
  -
  -
  -APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, apr_wait_t *status,
  -                                                  apr_wait_how_e waithow, apr_pool_t *p)
  +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,
  +                                                  int *exitcode,
  +                                                  apr_exit_why_e *exitwhy,
  +                                                  apr_wait_how_e waithow,
  +                                                  apr_pool_t *p)
   {
       RESULTCODES codes;
       ULONG rc;
  @@ -527,8 +528,8 @@
   
   
   APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
  -                                        apr_wait_t *exitcode,
  -                                        apr_wait_how_e wait)
  +                                        int *exitcode, apr_exit_why_e *exitwhy,
  +                                        apr_wait_how_e waithow)
   {
       RESULTCODES codes;
       ULONG rc;
  
  
  
  1.50      +29 -10    apr/threadproc/unix/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/unix/proc.c,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- proc.c	2001/09/21 16:14:50	1.49
  +++ proc.c	2001/10/23 17:30:08	1.50
  @@ -362,37 +362,56 @@
   }
   
   APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, 
  -                                                  apr_wait_t *status,
  +                                                  int *exitcode,
  +                                                  apr_exit_why_e *exitwhy,
                                                     apr_wait_how_e waithow, 
                                                     apr_pool_t *p)
   {
       proc->pid = -1;
  -    return apr_proc_wait(proc, status, waithow);
  +    return apr_proc_wait(proc, exitcode, exitwhy, waithow);
   } 
   
   APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, 
  -                                        apr_wait_t *exitcode,
  +                                        int *exitcode, apr_exit_why_e *exitwhy,
                                           apr_wait_how_e waithow)
   {
       pid_t pstatus;
       int waitpid_options = WUNTRACED;
       int exit_int;
  +    int ignore;
  +    apr_exit_why_e ignorewhy;
   
  +    if (exitcode == NULL) {
  +        exitcode = &ignore;
  +    }
  +    if (exitwhy == NULL) {
  +        exitwhy = &ignorewhy;
  +    }
  +
       if (waithow != APR_WAIT) {
           waitpid_options |= WNOHANG;
       }
       
       if ((pstatus = waitpid(proc->pid, &exit_int, waitpid_options)) > 0) {
  -        if (proc->pid == -1) {
  -            proc->pid = pstatus;
  -        }
  +        proc->pid = pstatus;
           if (WIFEXITED(exit_int)) {
  -            if (exitcode != NULL) {
  -                *exitcode = WEXITSTATUS(exit_int);
  +            *exitwhy = APR_PROC_EXIT;
  +            *exitcode = WEXITSTATUS(exit_int);
  +        }
  +        else if (WIFSIGNALED(exit_int)) {
  +            *exitwhy = APR_PROC_SIGNAL;
  +#ifdef WCOREDUMP
  +            if (WCOREDUMP(exit_int)) {
  +                *exitwhy |= APR_PROC_SIGNAL_CORE;
               }
  -            return APR_CHILD_DONE;
  +#endif
  +            *exitcode = WTERMSIG(exit_int);
  +        }
  +        else {
  +            /* unexpected condition */
  +            return APR_EGENERAL;
           }
  -        return APR_CHILD_NOTDONE;
  +        return APR_CHILD_DONE;
       }
       else if (pstatus == 0) {
           return APR_CHILD_NOTDONE;
  
  
  
  1.58      +2 -2      apr/threadproc/win32/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/win32/proc.c,v
  retrieving revision 1.57
  retrieving revision 1.58
  diff -u -r1.57 -r1.58
  --- proc.c	2001/09/20 17:21:01	1.57
  +++ proc.c	2001/10/23 17:30:08	1.58
  @@ -541,8 +541,8 @@
   }
   
   APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
  -                                        apr_wait_t *exitcode, 
  -                                        apr_wait_how_e wait)
  +                                        int *exitcode, apr_exit_why_e *exitwhy,
  +                                        apr_wait_how_e waithow)
   {
       DWORD stat;
       DWORD time;