You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by bj...@apache.org on 2001/10/26 04:31:04 UTC
cvs commit: apr/threadproc/os2 proc.c
bjh 01/10/25 19:31:04
Modified: threadproc/os2 proc.c
Log:
OS/2: Implement exitcode/exitwhy enhancements in apr_proc_wait*
Revision Changes Path
1.47 +64 -8 apr/threadproc/os2/proc.c
Index: proc.c
===================================================================
RCS file: /home/cvs/apr/threadproc/os2/proc.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- proc.c 2001/10/23 17:30:08 1.46
+++ proc.c 2001/10/26 02:31:04 1.47
@@ -496,6 +496,66 @@
return status;
}
+
+
+static void proces_result_codes(RESULTCODES codes,
+ int *exitcode,
+ apr_exit_why_e *exitwhy)
+{
+ int result = 0;
+ apr_exit_why_e why = APR_PROC_EXIT;
+
+ switch (codes.codeTerminate) {
+ case TC_EXIT: /* Normal exit */
+ why = APR_PROC_EXIT;
+ result = codes.codeResult;
+ break;
+
+ case TC_HARDERROR: /* Hard error halt */
+ why = APR_PROC_SIGNAL;
+ result = SIGSYS;
+ break;
+
+ case TC_KILLPROCESS: /* Was killed by a DosKillProcess() */
+ why = APR_PROC_SIGNAL;
+ result = SIGKILL;
+ break;
+
+ case TC_TRAP: /* TRAP in 16 bit code */
+ case TC_EXCEPTION: /* Threw an exception (32 bit code) */
+ why = APR_PROC_SIGNAL;
+
+ switch (codes.codeResult | XCPT_FATAL_EXCEPTION) {
+ case XCPT_ACCESS_VIOLATION:
+ result = SIGSEGV;
+ break;
+
+ case XCPT_ILLEGAL_INSTRUCTION:
+ result = SIGILL;
+ break;
+
+ case XCPT_FLOAT_DIVIDE_BY_ZERO:
+ case XCPT_INTEGER_DIVIDE_BY_ZERO:
+ result = SIGFPE;
+ break;
+
+ default:
+ result = codes.codeResult;
+ break;
+ }
+ }
+
+ if (exitcode) {
+ *exitcode = result;
+ }
+
+ if (exitwhy) {
+ *exitwhy = why;
+ }
+}
+
+
+
APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,
int *exitcode,
apr_exit_why_e *exitwhy,
@@ -509,14 +569,11 @@
if (!proc)
return APR_ENOPROC;
- rc = DosWaitChild(DCWA_PROCESSTREE, wait == APR_WAIT ? DCWW_WAIT : DCWW_NOWAIT, &codes, &pid, 0);
+ rc = DosWaitChild(DCWA_PROCESSTREE, waithow == APR_WAIT ? DCWW_WAIT : DCWW_NOWAIT, &codes, &pid, 0);
if (rc == 0) {
proc->pid = pid;
-
- if (status)
- *status = codes.codeResult;
-
+ proces_result_codes(codes, exitcode, exitwhy);
return APR_CHILD_DONE;
} else if (rc == ERROR_CHILD_NOT_COMPLETE) {
return APR_CHILD_NOTDONE;
@@ -538,11 +595,10 @@
if (!proc)
return APR_ENOPROC;
- rc = DosWaitChild(DCWA_PROCESS, wait == APR_WAIT ? DCWW_WAIT : DCWW_NOWAIT, &codes, &pid, proc->pid);
+ rc = DosWaitChild(DCWA_PROCESS, waithow == APR_WAIT ? DCWW_WAIT : DCWW_NOWAIT, &codes, &pid, proc->pid);
- if (exitcode)
- *exitcode = codes.codeResult;
if (rc == 0) {
+ proces_result_codes(codes, exitcode, exitwhy);
return APR_CHILD_DONE;
} else if (rc == ERROR_CHILD_NOT_COMPLETE) {
return APR_CHILD_NOTDONE;