You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by st...@apache.org on 2002/11/12 05:24:51 UTC

cvs commit: apr/memory/unix apr_pools.c

stoddard    2002/11/11 20:24:51

  Modified:    .        CHANGES
               memory/unix apr_pools.c
  Log:
  Update free_proc_chain timeout algorithm from a static 3 second timeout
  to an exponentiallly growing timeout.
  
  PR: 7617
  
  Revision  Changes    Path
  1.355     +8 -0      apr/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apr/CHANGES,v
  retrieving revision 1.354
  retrieving revision 1.355
  diff -u -r1.354 -r1.355
  --- CHANGES	10 Nov 2002 08:35:15 -0000	1.354
  +++ CHANGES	12 Nov 2002 04:24:51 -0000	1.355
  @@ -1,4 +1,12 @@
   Changes with APR 0.9.2
  +  *) Update timeout algorithm in free_proc_chain. If a subprocess
  +     did not exit immediately, the thread would sleep for 3 seconds
  +     before checking the subprocess exit status again. In a very
  +     common case when the subprocess was an HTTP server CGI script,
  +     the CGI script actually exited a fraction of a second into the 3
  +     second sleep, which effectively limited the server to serving one 
  +     CGI request every 3 seconds across a persistent connection.
  +     [Bill Stoddard, Kai.Risku@arrak.fi]
   
     *) Update doxygen tags.  [Justin Erenkrantz]
   
  
  
  
  1.189     +36 -3     apr/memory/unix/apr_pools.c
  
  Index: apr_pools.c
  ===================================================================
  RCS file: /home/cvs/apr/memory/unix/apr_pools.c,v
  retrieving revision 1.188
  retrieving revision 1.189
  diff -u -r1.188 -r1.189
  --- apr_pools.c	22 Oct 2002 13:52:16 -0000	1.188
  +++ apr_pools.c	12 Nov 2002 04:24:51 -0000	1.189
  @@ -86,6 +86,15 @@
   #define BOUNDARY_INDEX 12
   #define BOUNDARY_SIZE (1 << BOUNDARY_INDEX)
   
  +/* 
  + * Timing constants for killing subprocesses
  + * There is a total 3-second delay between sending a SIGINT 
  + * and sending of the final SIGKILL.
  + * TIMEOUT_INTERVAL should be set to TIMEOUT_USECS / 64
  + * for the exponetial timeout alogrithm.
  + */
  +#define TIMEOUT_USECS    3000000
  +#define TIMEOUT_INTERVAL   46875
   
   /*
    * Allocator
  @@ -2031,6 +2040,7 @@
        */
       struct process_chain *pc;
       int need_timeout = 0;
  +    apr_time_t timeout_interval;
   
       if (!procs)
           return; /* No work.  Whew! */
  @@ -2071,9 +2081,32 @@
           }
       }
   
  -    /* Sleep only if we have to... */
  -    if (need_timeout)
  -        apr_sleep(apr_time_from_sec(3));
  +    /* Sleep only if we have to. The sleep algorithm grows
  +     * by a factor of two on each iteration. TIMEOUT_INTERVAL
  +     * is equal to TIMEOUT_USECS / 64.
  +     */
  +    if (need_timeout) {
  +        timeout_interval = TIMEOUT_INTERVAL;
  +        apr_sleep(timeout_interval);
  +    }
  +    while (need_timeout) {
  +        need_timeout = 0;
  +        /* check the status of the subprocesses */
  +        for (pc = procs; pc; pc = pc->next) {
  +            if (pc->kill_how == APR_KILL_AFTER_TIMEOUT &&
  +                apr_proc_wait(pc->pid, NULL, NULL, APR_NOWAIT) != APR_CHILD_NOTDONE)
  +                pc->kill_how = APR_KILL_NEVER;	/* subprocess has exited */
  +            else
  +                need_timeout = 1;		/* subprocess is still active */
  +        }
  +        if (need_timeout) {
  +            apr_sleep(timeout_interval);
  +            timeout_interval *= 2;
  +            if (timeout_interval >= TIMEOUT_USECS) {
  +                break;
  +            }
  +        }
  +    }
   
       /* OK, the scripts we just timed out for have had a chance to clean up
        * --- now, just get rid of them, and also clean up the system accounting