Yes. Thanks.
-David
"Bill Stoddard"
<[EMAIL PROTECTED] To: <[EMAIL PROTECTED]>
om> cc:
Subject: RE: cvs commit:
apache-1.3/src/main alloc.c
12/16/2002 01:35
PM
Please respond to
dev
Does this patch work for you?
Index: alloc.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/alloc.c,v
retrieving revision 1.132
diff -u -r1.132 alloc.c
--- alloc.c 8 Dec 2002 20:51:43 -0000 1.132
+++ alloc.c 16 Dec 2002 20:35:19 -0000
@@ -2788,7 +2788,7 @@
timeout_interval = TIMEOUT_INTERVAL;
tv.tv_sec = 0;
tv.tv_usec = timeout_interval;
- select(0, NULL, NULL, NULL, &tv);
+ ap_select(0, NULL, NULL, NULL, &tv);
do {
need_timeout = 0;
@@ -2806,7 +2806,7 @@
}
tv.tv_sec = timeout_interval / 1000000;
tv.tv_usec = timeout_interval % 1000000;
- select(0, NULL, NULL, NULL, &tv);
+ ap_select(0, NULL, NULL, NULL, &tv);
timeout_interval *= 2;
}
} while (need_timeout);
> Can these added "select" calls be changed to "ap_select"?
> That way the ap_select #define's in ap_config.h will get applied.
>
> Sorry for the late feedback.
>
> -David
>
>
>
>
>
> [EMAIL PROTECTED]
>
> rg To:
> [EMAIL PROTECTED]
> cc:
>
> 11/12/2002 03:44 Subject: cvs commit:
> apache-1.3/src/main alloc.c
> PM
>
> Please respond to
>
> dev
>
>
>
>
>
>
>
>
>
> stoddard 2002/11/12 14:44:07
>
> Modified: src CHANGES
> src/main alloc.c
> Log:
> Update timeout algorithm in free_proc_chain. Try polling the existing
> subprocess
> a few times before going into a 3 second sleep. Often we find that the
> subprocess
> will exit within milliseconds.
>
> Revision Changes Path
> 1.1861 +8 -0 apache-1.3/src/CHANGES
>
> Index: CHANGES
> ===================================================================
> RCS file: /home/cvs/apache-1.3/src/CHANGES,v
> retrieving revision 1.1860
> retrieving revision 1.1861
> diff -u -r1.1860 -r1.1861
> --- CHANGES 12 Nov 2002 19:59:15 -0000 1.1860
> +++ CHANGES 12 Nov 2002 22:44:05 -0000 1.1861
> @@ -1,4 +1,12 @@
> Changes with Apache 1.3.28
> + *) 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.
> + PRs 6961, 8664 [Bill Stoddard]
>
> *) mod_setenvif: Add SERVER_ADDR special keyword to allow
> envariable setting according to the server IP address
>
>
>
> 1.129 +50 -7 apache-1.3/src/main/alloc.c
>
> Index: alloc.c
> ===================================================================
> RCS file: /home/cvs/apache-1.3/src/main/alloc.c,v
> retrieving revision 1.128
> retrieving revision 1.129
> diff -u -r1.128 -r1.129
> --- alloc.c 7 Sep 2002 22:57:05 -0000 1.128
> +++ alloc.c 12 Nov 2002 22:44:06 -0000 1.129
> @@ -2624,15 +2624,28 @@
> return pid;
> }
>
> +
> +/*
> + * 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
> +
> static void free_proc_chain(struct process_chain *procs)
> {
> /* Dispose of the subprocesses we've spawned off in the course of
> * whatever it was we're cleaning up now. This may involve
killing
> * some of them off...
> */
> -
> + struct timeval tv;
> struct process_chain *p;
> int need_timeout = 0;
> + int timeout_interval;
> + int exit_int;
> int status;
>
> if (procs == NULL)
> @@ -2694,18 +2707,49 @@
> if ((p->kill_how == kill_after_timeout)
> || (p->kill_how == kill_only_once)) {
> /* Subprocess may be dead already. Only need the
timeout
> if not. */
> - if (ap_os_kill(p->pid, SIGTERM) != -1)
> + if (ap_os_kill(p->pid, SIGTERM) == -1) {
> + p->kill_how = kill_never;
> + }
> + else {
> need_timeout = 1;
> + }
> }
> else if (p->kill_how == kill_always) {
> kill(p->pid, SIGKILL);
> }
> }
>
> - /* Sleep only if we have to... */
> -
> - if (need_timeout)
> - sleep(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;
> + tv.tv_sec = 0;
> + tv.tv_usec = timeout_interval;
> + select(0, NULL, NULL, NULL, &tv);
> +
> + do {
> + need_timeout = 0;
> + for (p = procs; p; p = p->next) {
> + if (p->kill_how == kill_after_timeout) {
> + if (waitpid(p->pid, (int *) 0, WNOHANG |
WUNTRACED)
> > 0)
> + p->kill_how = kill_never;
> + else
> + need_timeout = 1;
> + }
> + }
> + if (need_timeout) {
> + if (timeout_interval >= TIMEOUT_USECS) {
> + break;
> + }
> + tv.tv_sec = timeout_interval / 1000000;
> + tv.tv_usec = timeout_interval % 1000000;
> + select(0, NULL, NULL, NULL, &tv);
> + timeout_interval *= 2;
> + }
> + } while (need_timeout);
> + }
>
> /* 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
> @@ -2713,7 +2757,6 @@
> */
>
> for (p = procs; p; p = p->next) {
> -
> if (p->kill_how == kill_after_timeout)
> kill(p->pid, SIGKILL);
>
>
>
>
>
>
>
>