ben         96/07/17 16:20:52

  Modified:    src       CHANGES conf.h http_main.c
  Log:
  Work around broken wait() behaviour in Irix (and perhaps others).
  
  Revision  Changes    Path
  1.44      +4 -0      apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -C3 -r1.43 -r1.44
  *** CHANGES   1996/07/17 08:33:40     1.43
  --- CHANGES   1996/07/17 23:20:47     1.44
  ***************
  *** 6,11 ****
  --- 6,15 ----
      *) Graceful restart code added. This allows the server to restart without
         losing current connections on receipt of signal 2 (SIGINT). [Ben 
Laurie]
    
  +   *) Added BROKEN_WAIT flag to conf.h, to be used on systems which fail to
  +      reap their children correctly (symptom: mod_status shows children which
  +      don't exist). [Ben Laurie]
  + 
    Changes with Apache 1.1.1:
    
      *) Fixed bug where Cookie module would make two entries in the
  
  
  
  1.22      +1 -0      apache/src/conf.h
  
  Index: conf.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/conf.h,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -C3 -r1.21 -r1.22
  *** conf.h    1996/07/17 15:09:58     1.21
  --- conf.h    1996/07/17 23:20:49     1.22
  ***************
  *** 94,99 ****
  --- 94,100 ----
    #define HAVE_SHMGET
    #define HAVE_CRYPT_H
    #define NO_LONG_DOUBLE
  + #define BROKEN_WAIT
    
    #elif defined(HPUX) || defined(HPUX10)
    #define HAVE_RESOURCE
  
  
  
  1.51      +29 -2     apache/src/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_main.c,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -C3 -r1.50 -r1.51
  *** http_main.c       1996/07/16 22:14:54     1.50
  --- http_main.c       1996/07/17 23:20:50     1.51
  ***************
  *** 937,945 ****
    #endif
    }
    
    int wait_or_timeout (int *status)
    {
  !     wait_or_timeout_retval = -1;
        
    #if defined(NEXT)
        if (setjmp(wait_timeout_buf) != 0) {
  --- 937,966 ----
    #endif
    }
    
  + #ifdef BROKEN_WAIT
  + /*
  + Some systems appear to fail to deliver dead children to wait() at times.
  + This sorts them out.
  + */
  + void reap_children()
  +     {
  +     int status,n;
  + 
  +     for(n=0 ; n < HARD_SERVER_LIMIT ; ++n)
  +     if(scoreboard_image->servers[n].status != SERVER_DEAD
  +        && waitpid(scoreboard_image->servers[n].pid,&status,WNOHANG) == -1
  +        && errno == ECHILD)
  +         {
  +         sync_scoreboard_image();
  +         update_child_status(n,SERVER_DEAD,NULL);
  +         }
  +     }
  + #endif
  + 
    int wait_or_timeout (int *status)
    {
  !     int wait_or_timeout_retval = -1;
  !     static int ntimes;
        
    #if defined(NEXT)
        if (setjmp(wait_timeout_buf) != 0) {
  ***************
  *** 949,955 ****
        errno = ETIMEDOUT;
        return wait_or_timeout_retval;
        }
  !     
        signal (SIGALRM, longjmp_out_of_alarm);
        alarm(1);
    #if defined(NEXT)
  --- 970,982 ----
        errno = ETIMEDOUT;
        return wait_or_timeout_retval;
        }
  ! #ifdef BROKEN_WAIT
  !     if(++ntimes == 60)
  !     {
  !     reap_children();
  !     ntimes=0;
  !     }
  ! #endif
        signal (SIGALRM, longjmp_out_of_alarm);
        alarm(1);
    #if defined(NEXT)
  
  
  

Reply via email to