--- /usr/tmp/TmpDir.12332-0/src/pmie/src/act.sk_1.4 Thu Jan 2 20:48:02 2003 +++ src/pmie/src/act.sk Thu Jan 2 15:37:01 2003 @@ -6,7 +6,7 @@ * skeleton: act.sk - actions * ***********************************************************************/ -/* $Id: act.sk,v 1.4 2002/10/18 01:56:27 kenmcd Exp $ */ +/* $Id: act.sk,v 1.2 2002/08/20 06:46:48 markgw Exp $ */ /* * operator: actAnd @@ -70,12 +70,27 @@ } else if (pid > 0) { /* parent, wait for child to exit to catch status */ +#if PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL2) { + fprintf(stderr, "actShell: fork: pid=%d\n", pid); + } +#endif sts = waitpid(pid, &x->valid, 0); #if PCP_DEBUG if (pmDebug & DBG_TRACE_APPL2) { - fprintf(stderr, "actShell: pid=%d status=%d (wait returns %d)\n", pid, x->valid, sts); + fprintf(stderr, "actShell: wait: pid=%d status=0x%x", pid, x->valid); + if (WIFEXITED(x->valid)) + fprintf(stderr, " exit=%d", WEXITSTATUS(x->valid)); + if (WIFSIGNALED(x->valid)) + fprintf(stderr, " signal=%d", WTERMSIG(x->valid)); + fprintf(stderr, " (wait returns %d)\n", sts); } #endif + if (WIFEXITED(x->valid)) + x->valid = WEXITSTATUS(x->valid); + else + /* if no exit, then assume non-zero exit, hence failure! */ + x->valid = 1; if (sts < 0 || x->valid != 0) *(Truth *)x->ring = FALSE; else @@ -124,9 +139,29 @@ } /* if old alarm still active, don't post new one */ - if ((x->valid != 0) && - (waitpid((pid_t)x->valid, NULL, WNOHANG) == 0)) - return; + if (x->valid != 0) { + pid_t pid; + pid = waitpid((pid_t)x->valid, &sts, WNOHANG); + if (pid <= 0) { +#if PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL2) { + fprintf(stderr, "actAlarm: wait: pid=%d not done (wait returns %d)\n", x->valid, pid); + } +#endif + return; + } +#if PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL2) { + fprintf(stderr, "actAlarm: wait: pid=%d done status=0x%x", x->valid, sts); + if (WIFEXITED(sts)) + fprintf(stderr, " exit=%d", WEXITSTATUS(sts)); + if (WIFSIGNALED(sts)) + fprintf(stderr, " signal=%d", WTERMSIG(sts)); + fprintf(stderr, " (wait returns %d)\n", pid); + } +#endif + x->valid = 0; + } if ((arg2 == NULL) || (x->smpls[0].stamp == 0) || @@ -150,6 +185,11 @@ _exit(1); /* avoid atexit() handler */ } else if (sts > 0) { +#if PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL2) { + fprintf(stderr, "actAlarm: fork: pid=%d\n", sts); + } +#endif x->valid = sts; *(Truth *)x->ring = TRUE; x->smpls[0].stamp = now;