Here is yet another patch. When compared with the previous patch,
this one adds the native status to the parameter lists of
apr_proc_wait() and apr_proc_wait_all_procs(). Fewer MPM changes are
necessary.
missing: fix the doc in apr_thread_proc.h
roll the changes into apr/threadproc/foo/proc.c, foo != unix
untested, but there isn't much to screw up
The interfaces are the important thing to look at.
Index: server/mpm_common.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm_common.c,v
retrieving revision 1.69
diff -u -r1.69 mpm_common.c
--- server/mpm_common.c 2001/09/21 14:29:33 1.69
+++ server/mpm_common.c 2001/10/18 17:31:01
@@ -124,7 +124,7 @@
continue;
proc.pid = pid;
- waitret = apr_proc_wait(&proc, NULL, APR_NOWAIT);
+ waitret = apr_proc_wait(&proc, NULL, NULL, NULL, APR_NOWAIT);
if (waitret != APR_CHILD_NOTDONE) {
MPM_NOTE_CHILD_KILLED(i);
continue;
@@ -204,7 +204,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, NULL, NULL, status, APR_NOWAIT, p);
if (APR_STATUS_IS_EINTR(rv)) {
ret->pid = -1;
return;
@@ -213,6 +213,7 @@
return;
}
#ifdef NEED_WAITPID
+ /* wtf... ancient cruft? */
if ((ret = reap_children(status)) > 0) {
return;
}
Index: srclib/apr/include/apr_thread_proc.h
===================================================================
RCS file: /home/cvs/apr/include/apr_thread_proc.h,v
retrieving revision 1.75
diff -u -r1.75 apr_thread_proc.h
--- srclib/apr/include/apr_thread_proc.h 2001/09/20 08:59:30 1.75
+++ srclib/apr/include/apr_thread_proc.h 2001/10/18 17:31:04
@@ -81,6 +81,7 @@
typedef enum {APR_SHELLCMD, APR_PROGRAM} apr_cmdtype_e;
typedef enum {APR_WAIT, APR_NOWAIT} apr_wait_how_e;
+typedef enum {APR_CHILD_NORMAL_EXIT, APR_CHILD_SIGNAL_EXIT} apr_exit_how_e;
#define APR_NO_PIPE 0
#define APR_FULL_BLOCK 1
@@ -481,11 +482,18 @@
/**
* 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.
+ * @parameter exithow How the child exited. One of:
+ * <PRE>
+ * APR_CHILD_NORMAL_EXIT -- child exited normally
+ * APR_CHILD_SIGNAL_EXIT -- child exited due to an uncaught signal
+ * </PRE>
+ * This parameter may be NULL if the reason for exiting is not needed.
+ * @param exitcode_or_signal The returned exit status of the child, if a child
+ * process died normally, or the signal number if the child
+ * process died due to an uncaught signal. 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 waithow How should we wait. One of:
* <PRE>
* APR_WAIT -- block until the child process dies.
@@ -499,7 +507,9 @@
* </PRE>
*/
APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
- apr_wait_t *exitcode,
+ apr_exit_how_e *exithow,
+ int *exitcode_or_signal,
+ apr_wait_t *native_status,
apr_wait_how_e waithow);
/**
@@ -507,9 +517,6 @@
* 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 waithow How should we wait. One of:
* <PRE>
* APR_WAIT -- block until the child process dies.
@@ -519,9 +526,11 @@
* @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);
+ apr_exit_how_e *exithow,
+ int *exitcode_or_signal,
+ apr_wait_t *native_status,
+ apr_wait_how_e waithow,
+ apr_pool_t *p);
/**
* Detach the process from the controlling terminal.
Index: srclib/apr/memory/unix/apr_pools.c
===================================================================
RCS file: /home/cvs/apr/memory/unix/apr_pools.c,v
retrieving revision 1.113
diff -u -r1.113 apr_pools.c
--- srclib/apr/memory/unix/apr_pools.c 2001/09/28 15:22:35 1.113
+++ srclib/apr/memory/unix/apr_pools.c 2001/10/18 17:31:09
@@ -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, 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, NULL, APR_WAIT);
}
}
#ifdef WIN32
Index: srclib/apr/threadproc/unix/proc.c
===================================================================
RCS file: /home/cvs/apr/threadproc/unix/proc.c,v
retrieving revision 1.49
diff -u -r1.49 proc.c
--- srclib/apr/threadproc/unix/proc.c 2001/09/21 16:14:50 1.49
+++ srclib/apr/threadproc/unix/proc.c 2001/10/18 17:31:12
@@ -362,37 +362,57 @@
}
APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,
- apr_wait_t *status,
+ apr_exit_how_e *exithow,
+ int *exitcode_or_signal,
+ apr_wait_t *native_status,
apr_wait_how_e waithow,
apr_pool_t *p)
{
proc->pid = -1;
- return apr_proc_wait(proc, status, waithow);
+ return apr_proc_wait(proc, exithow, exitcode_or_signal, native_status,
+ waithow);
}
APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
- apr_wait_t *exitcode,
+ apr_exit_how_e *exithow,
+ int *exitcode_or_signal,
+ apr_wait_t *native_status,
apr_wait_how_e waithow)
{
pid_t pstatus;
- int waitpid_options = WUNTRACED;
- int exit_int;
+ int waitpid_options = 0;
+ int exit_int, ignored_exitcode_or_signal;
+ apr_exit_how_e ignored_exithow;
+ apr_wait_t ignored_native_status;
+ /* exithow and exitcode_or_signal and ignored_native_status are optional */
+ if (!exithow)
+ exithow = &ignored_exithow;
+ if (!exitcode_or_signal)
+ exitcode_or_signal = &ignored_exitcode_or_signal;
+ if (!native_status)
+ native_status = &ignored_native_status;
+
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;
+ *native_status = exit_int;
if (WIFEXITED(exit_int)) {
- if (exitcode != NULL) {
- *exitcode = WEXITSTATUS(exit_int);
- }
- return APR_CHILD_DONE;
+ *exithow = APR_CHILD_NORMAL_EXIT;
+ *exitcode_or_signal = WEXITSTATUS(exit_int);
+ }
+ else if (WIFSIGNALED(exit_int)) {
+ *exithow = APR_CHILD_SIGNAL_EXIT;
+ *exitcode_or_signal = 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;
--
Jeff Trawick | [EMAIL PROTECTED] | PGP public key at web site:
http://www.geocities.com/SiliconValley/Park/9289/
Born in Roswell... married an alien...