Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: long-standing tty related issue: wrapped Emacs not suspended
- X-seq: zsh-workers 43564
- From: Peter Stephenson <p.stephenson@xxxxxxxxxxx>
- To: "zsh-workers@xxxxxxx" <zsh-workers@xxxxxxx>
- Subject: Re: long-standing tty related issue: wrapped Emacs not suspended
- Date: Wed, 26 Sep 2018 16:17:08 +0100
- Cms-type: 201P
- Dkim-filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20180926151712euoutp010dc9cdfcfb66c2209a097f4764e715b6~X-CSf-8ht0125501255euoutp01m
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1537975032; bh=gINP+WsSEOCVHhAaoE1iFNBbOebshMF2Njpad4PXqOI=; h=Date:From:To:Subject:In-Reply-To:References:From; b=bLjNmIf8qG6yvGD7wEIwf5re3/QSE8J1qf2ZmO7BOfQjEjBvCSU+cIblLCwe4TUh4 miX7O3jyqNx8YLtMmZ5W+NA9xXWwTekF+Uxab2yznM2hOQpJMFN/W6J2AbnuMfvCem jg+JszfLBz8ZeVIgfCbxMtbxHic1tDd8z4yHE44Q=
- In-reply-to: <CAH+w=7ZmhsKwJTSU90gDrZy1FgJQDAfkYaLMmY8Eq=aSAYdQwg@mail.gmail.com>
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- List-unsubscribe: <mailto:zsh-workers-unsubscribe@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- Organization: SCSC
- References: <20180920123005.GA20647@zira.vinc17.org> <20180921175740.6ab97a81@pws-HP.localdomain> <CGME20180924200327epcas5p16c59687fb2a9ac2ea8919ceab7705c02@epcas5p1.samsung.com> <20180924205106.03ee3da6@pws-HP.localdomain> <20180925103759eucas1p2a15709c7a9d8df72d8c390521a6999ab~XnlOUhOUG3250532505eucas1p2u@eucas1p2.samsung.com> <CAH+w=7ZmhsKwJTSU90gDrZy1FgJQDAfkYaLMmY8Eq=aSAYdQwg@mail.gmail.com>
On Tue, 25 Sep 2018 22:47:44 -0700
Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
But if you ^Z a function and then background it, the parent still
> believes it to be running even though it has instantly stopped:
>
> % e
> zsh: suspended e
> % bg
> [1] + continued e
> % jobs
> [1] + running e
To get this to work, I had to hack printjobs(). There's another hack in
printjobs to do pretty much the reverse --- if you're in the superjob
and the last job is suspended, treat it as running, because that's the
subshell that's waiting for the subjob so it's suspension isn't
relevant. However, in this case I'm actually printing the subjob state
as the most relevant so that works around that --- this also means
"jobs" lists the correct process as suspended.
I've also added a printjob() to the point where the subjob is suspended
to make it reflect the fact that, as far as the user is concerned,
everything is associated with the superjob.
I would say we are in danger of disappearing up our own backsides but I
think that happened long ago.
pws
diff --git a/Src/jobs.c b/Src/jobs.c
index f64b46b..8103f5c 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 */
Messages sorted by:
Reverse Date,
Date,
Thread,
Author