1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-05-20 11:31:28 +02:00

52365: record state of exited background jobs so as to be visible in TRAPCHLD

This commit is contained in:
Bart Schaefer 2023-12-09 19:36:47 -08:00
parent 618f842b46
commit 0ecc456fb2
3 changed files with 27 additions and 13 deletions

View file

@ -1,3 +1,8 @@
2023-12-09 Bart Schaefer <schaefer@zsh.org>
* 52365: Src/jobs.c, Src/signals.c: record state of exited
background jobs sooner so as to be visible in TRAPCHLD
2023-12-05 Oliver Kiddle <opk@zsh.org>
* 52326, 52372: configure.ac, Src/jobs.c, Doc/Zsh/builtins.yo,

View file

@ -660,6 +660,25 @@ update_job(Job jn)
}
}
/**/
void
update_bg_job(Job jn, pid_t pid, int status)
{
/*
* Accumulate a list of older jobs. We only do this for
* background jobs, which is something in the job table
* that's not marked as in the current shell or as shell builtin
* and is not equal to the current foreground job.
*/
if (jn && !(jn->stat & (STAT_CURSH|STAT_BUILTIN)) &&
jn - jobtab != thisjob) {
if (WIFEXITED(status))
addbgstatus(pid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
addbgstatus(pid, 0200 | WTERMSIG(status));
}
}
/* set the previous job to something reasonable */
/**/

View file

@ -556,9 +556,11 @@ wait_for_processes(void)
jn->gleader = 0;
}
}
update_bg_job(jn, pid, status);
update_job(jn);
} else if (findproc(pid, &jn, &pn, 1)) {
pn->status = status;
update_bg_job(jn, pid, status);
update_job(jn);
} else {
/* If not found, update the shell record of time spent by
@ -567,19 +569,7 @@ wait_for_processes(void)
* terminates.
*/
get_usage();
}
/*
* Accumulate a list of older jobs. We only do this for
* background jobs, which is something in the job table
* that's not marked as in the current shell or as shell builtin
* and is not equal to the current foreground job.
*/
if (jn && !(jn->stat & (STAT_CURSH|STAT_BUILTIN)) &&
jn - jobtab != thisjob) {
if (WIFEXITED(status))
addbgstatus(pid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
addbgstatus(pid, 0200 | WTERMSIG(status));
update_bg_job(jn, pid, status);
}
unqueue_signals();