diff options
author | Peter Stephenson <p.stephenson@samsung.com> | 2018-09-26 16:23:00 +0100 |
---|---|---|
committer | Peter Stephenson <p.stephenson@samsung.com> | 2018-09-26 16:23:00 +0100 |
commit | c2d65a3a6ecdeecf05803a6fe0d03fd3383fe178 (patch) | |
tree | 34da022fa4278dcce80a37a9d2b4ad90b539c723 /Src | |
parent | 3da60d210292698c00279d95150a79550e7e6370 (diff) | |
download | zsh-c2d65a3a6ecdeecf05803a6fe0d03fd3383fe178.tar.gz zsh-c2d65a3a6ecdeecf05803a6fe0d03fd3383fe178.tar.xz zsh-c2d65a3a6ecdeecf05803a6fe0d03fd3383fe178.zip |
43564: improve job control report about stopped subjob
Diffstat (limited to 'Src')
-rw-r--r-- | Src/jobs.c | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/Src/jobs.c b/Src/jobs.c index f64b46b74..8103f5c92 100644 --- a/Src/jobs.c +++ b/Src/jobs.c @@ -466,8 +466,10 @@ update_job(Job jn) * or to exit. So we have to send it a SIGTSTP. */ int i; + jn->stat |= STAT_CHANGED | STAT_STOPPED; if ((i = super_job(job))) { - killpg(jobtab[i].gleader, SIGTSTP); + Job sjn = &jobtab[i]; + killpg(sjn->gleader, SIGTSTP); /* * Job may already be stopped if it consists of only the * forked shell waiting for the subjob -- so mark as @@ -475,9 +477,20 @@ update_job(Job jn) * crucially, the subjob, as the visible job used with * fg/bg is the superjob) a SIGCONT if we need it. */ - jobtab[i].stat |= STAT_CHANGED | STAT_STOPPED; + sjn->stat |= STAT_CHANGED | STAT_STOPPED; + if (isset(NOTIFY) && (sjn->stat & STAT_LOCKED) && + !(sjn->stat & STAT_NOPRINT)) { + /* + * Print the subjob state, which we don't usually + * do, so the user knows something has stopped. + * So as not to be confusing, we actually output + * the user-visible superjob. + */ + if (printjob(sjn, !!isset(LONGLISTJOBS), 0) && + zleactive) + zleentry(ZLE_CMD_REFRESH); + } } - jn->stat |= STAT_CHANGED | STAT_STOPPED; return; } if (jn->stat & STAT_STOPPED) @@ -1035,15 +1048,34 @@ printjob(Job jn, int lng, int synch) "bogus job number, jn = %L, jobtab = %L, oldjobtab = %L", (long)jn, (long)jobtab, (long)oldjobtab); - if (jn->stat & STAT_NOPRINT) { + if (jn->stat & STAT_NOPRINT) skip_print = 1; - } if (lng < 0) { conted = 1; lng = !!isset(LONGLISTJOBS); } + if (jn->stat & STAT_SUPERJOB && + jn->other) + { + Job sjn = &jobtab[jn->other]; + if (sjn->stat & STAT_STOPPED) + { + /* + * A subjob is stopped, which will prevent further excution + * of the superjob, which the user wants to know about. So + * report the status of the subjob as if it were the + * user-visible superjob. + * + * TBD: there may be other times we want to do this + * which would, for example, remove the need for the + * hack at the top of the loop over processes just below. + */ + jn = sjn; + } + } + /* find length of longest signame, check to see */ /* if we really need to print this job */ |