stoddard 00/01/27 19:10:53
Modified: src/lib/apr/include apr_win.h apr_winconfig.h src/lib/apr/lib apr_pools.c Log: Migrate free_proc_chain() for Windows to APR. Fix invalid handle exception when running CGI scripts. Revision Changes Path 1.15 +1 -0 apache-2.0/src/lib/apr/include/apr_win.h Index: apr_win.h =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_win.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- apr_win.h 2000/01/26 05:56:38 1.14 +++ apr_win.h 2000/01/28 03:10:49 1.15 @@ -75,6 +75,7 @@ #include <stdio.h> #include <time.h> #include <process.h> +#include <signal.h> #define ap_inline #define __attribute__(__x) 1.4 +1 -1 apache-2.0/src/lib/apr/include/apr_winconfig.h Index: apr_winconfig.h =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_winconfig.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- apr_winconfig.h 2000/01/26 05:56:38 1.3 +++ apr_winconfig.h 2000/01/28 03:10:49 1.4 @@ -79,7 +79,6 @@ #include <stdio.h> #include <time.h> - #define HAVE_SENDFILE 1 /* Use this section to define all of the HAVE_FOO_H @@ -89,6 +88,7 @@ #define HAVE_MALLOC_H 1 #define HAVE_STDLIB_H 1 #define HAVE_LIMITS_H 1 +#define HAVE_SIGNAL_H 1 typedef enum {APR_WIN_NT, APR_WIN_95, APR_WIN_98} ap_oslevel_e; 1.30 +31 -53 apache-2.0/src/lib/apr/lib/apr_pools.c Index: apr_pools.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/lib/apr_pools.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- apr_pools.c 1999/12/13 20:42:18 1.29 +++ apr_pools.c 2000/01/28 03:10:52 1.30 @@ -73,6 +73,7 @@ #include "apr_lib.h" #include "apr_lock.h" #include "misc.h" + #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif @@ -1248,7 +1249,6 @@ * whatever it was we're cleaning up now. This may involve killing * some of them off... */ - struct process_chain *p; int need_timeout = 0; int status; @@ -1263,70 +1263,39 @@ * don't waste any more cycles doing whatever it is that they shouldn't * be doing anymore. */ -#ifdef WIN32 - /* Pick up all defunct processes */ - for (p = procs; p; p = p->next) { - if (GetExitCodeProcess((HANDLE) p->pid, &status)) { - p->kill_how = kill_never; - } - } - - - for (p = procs; p; p = p->next) { - if (p->kill_how == kill_after_timeout) { - need_timeout = 1; - } - else if (p->kill_how == kill_always) { - TerminateProcess((HANDLE) p->pid, 1); - } - } - /* Sleep only if we have to... */ - - if (need_timeout) { - sleep(3); - } - - /* 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 - * goop... - */ - - for (p = procs; p; p = p->next) { - if (p->kill_how == kill_after_timeout) { - TerminateProcess((HANDLE) p->pid, 1); - } - } - for (p = procs; p; p = p->next) { - CloseHandle((HANDLE) p->pid); - } -#else #ifndef NEED_WAITPID /* Pick up all defunct processes */ for (p = procs; p; p = p->next) { - if (ap_wait_proc(p->pid, APR_NOWAIT) > 0) { - p->kill_how = kill_never; - } + if (ap_wait_proc(p->pid, APR_NOWAIT) == APR_CHILD_DONE) { + p->kill_how = kill_never; + } } #endif for (p = procs; p; p = p->next) { - 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_kill(p->pid, SIGTERM) != -1) { + if ((p->kill_how == kill_after_timeout) + || (p->kill_how == kill_only_once)) { + /* + * Subprocess may be dead already. Only need the timeout if not. + * Note: ap_kill on Windows is TerminateProcess(), which is + * similar to a SIGKILL, so always give the process a timeout + * under Windows before killing it. + */ +#ifdef WIN32 + need_timeout = 1; +#else + if (ap_kill(p->pid, APR_SIGTERM) == APR_SUCCESS) { need_timeout = 1; } +#endif } else if (p->kill_how == kill_always) { - ap_kill(p->pid, SIGKILL); + ap_kill(p->pid, APR_SIGKILL); } } /* Sleep only if we have to... */ - if (need_timeout) { sleep(3); } @@ -1335,16 +1304,25 @@ * --- now, just get rid of them, and also clean up the system accounting * goop... */ - for (p = procs; p; p = p->next) { - if (p->kill_how == kill_after_timeout) { - ap_kill(p->pid, SIGKILL); + ap_kill(p->pid, APR_SIGKILL); } + } +#ifdef WIN32 + /* Humm, still trying to understand what to do about this. + * Do we need an APR function to clean-up a proc_t? + * We have a handle leak here until this is fixed. + for (p = procs; p; p = p->next) { + CloseHandle(p->pid->pi.hProcess); + } + */ +#endif /* WIN32 */ + /* Now wait for all the signaled processes to die */ + for (p = procs; p; p = p->next) { if (p->kill_how != kill_never) { status = ap_wait_proc(p->pid, APR_WAIT); } } -#endif /* WIN32 */ }