diff options
author | Bart Schaefer <schaefer@zsh.org> | 2023-12-09 19:36:47 -0800 |
---|---|---|
committer | Bart Schaefer <schaefer@zsh.org> | 2023-12-09 19:36:47 -0800 |
commit | 0ecc456fb2a4dda75e9910bb019d381406f040e8 (patch) | |
tree | c4dd58e4f774a438fa102e4465d8aefa151c4863 | |
parent | 618f842b464c090f4a6fb02a9f4d217be9270466 (diff) | |
download | zsh-0ecc456fb2a4dda75e9910bb019d381406f040e8.tar.gz zsh-0ecc456fb2a4dda75e9910bb019d381406f040e8.tar.xz zsh-0ecc456fb2a4dda75e9910bb019d381406f040e8.zip |
52365: record state of exited background jobs so as to be visible in TRAPCHLD
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/jobs.c | 19 | ||||
-rw-r--r-- | Src/signals.c | 16 |
3 files changed, 27 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog index cd3cd4e84..af62f6e2a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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, diff --git a/Src/jobs.c b/Src/jobs.c index 4e9767ee4..118c5e61b 100644 --- a/Src/jobs.c +++ b/Src/jobs.c @@ -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 */ /**/ diff --git a/Src/signals.c b/Src/signals.c index a61368554..b1a843e2c 100644 --- a/Src/signals.c +++ b/Src/signals.c @@ -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(); |