JobFinish (job, status);
JobFinish(job, &status);
Job_CatchChildren (block)    Boolean	  block;    	/* TRUE if should block on the wait. */{    int    	  pid;	    	/* pid of dead child */    register Job  *job;	    	/* job descriptor for dead child */    LstNode       jnode;    	/* list element for finding job */    union wait	  status;   	/* Exit/termination status */    /*     * Don't even bother if we know there's no one around.     */    if (nLocal == 0) {	return;    }        while ((pid = wait3((int *)&status, (block?0:WNOHANG)|WUNTRACED,			(struct rusage *)0)) > 0)    {	if (DEBUG(JOB))	    printf("Process %d exited or stopped.\n", pid);	    	jnode = Lst_Find (jobs, (ClientData)&pid, JobCmpPid);	if (jnode == NILLNODE) {	    if (WIFSIGNALED(status) && (status.w_termsig == SIGCONT)) {		jnode = Lst_Find(stoppedJobs, (ClientData) &pid, JobCmpPid);		if (jnode == NILLNODE) {		    Error("Resumed child (%d) not in table", pid);		    continue;		}		job = (Job *)Lst_Datum(jnode);		(void)Lst_Remove(stoppedJobs, jnode);	    } else {		Error ("Child (%d) not in table?", pid);		continue;	    }	} else {	    job = (Job *) Lst_Datum (jnode);	    (void)Lst_Remove (jobs, jnode);	    nJobs -= 1;	    if (jobFull && DEBUG(JOB)) {		printf("Job queue is no longer full.\n");	    }	    jobFull = FALSE;	    nLocal -= 1;	}	JobFinish (job, status);    }}