zsh-workers
 help / color / mirror / code / Atom feed
From: Peter Stephenson <pws@ibmth.df.unipi.it>
To: zsh-workers@sunsite.auc.dk (Zsh hackers list)
Subject: PATCH: tty pgrp problem again: third attempt
Date: Tue, 11 May 1999 15:15:17 +0200	[thread overview]
Message-ID: <9905111315.AA24788@ibmth.df.unipi.it> (raw)
In-Reply-To: "Peter Stephenson"'s message of "Tue, 11 May 1999 13:58:21 DFT." <9905111158.AA34596@ibmth.df.unipi.it>

Peter Stephenson wrote:
> The only thing for it seems to be to trust the STAT_CURSH flag on the job,
> which says the last stage of the pipeline was run in the current shell, and
> hence must be in the foreground whatever the job number, which can get
> jiggled about if there are different structures like the while-loop above
> running in the current shell.  This should work, since that's what it's
> there for.  But maybe there are pathological cases [the whole @!$!!! shell,
> if you ask me sometimes].  This goes on top of the other one.
> 
> (I can't actually swear to understanding why thisjob isn't the job that's
> terminating, but it's to do with the pipeline code.)

Nope, that's no good.  In something like

% zcat foo.gz | if true; less; fi

the zcat can exit, in which case the test for messing around with the pgrp
comes up.  The code in update_job (called asynchronously as soon as zcat
finishes) doesn't know that the shell part of the code hasn't yet finished,
so it calls attachtty(mypgrp), with the consequence that the end of the
pipeline fails disastrously.

The best I can think of is simply marking the fact when we can't reattach
the tty, and the calling it when we know its safe, which is when the job
that's executing is finally deleted.  At least this seems to fix up the
problem without destroying the previous fixes (which still need applying).

Sven, you're the only person that ever understood the list_pipe stuff. Is
there a better way of handling this?  Should it really go somewhere in
execpline() or execpline2()?

--- Src/jobs.c.try3	Tue May 11 13:41:21 1999
+++ Src/jobs.c	Tue May 11 15:01:35 1999
@@ -201,8 +201,20 @@
 	/* is this job in the foreground of an interactive shell? */
 	if (mypgrp != pgrp && inforeground &&
 	    (jn->gleader == pgrp || (pgrp > 1 && kill(-pgrp, 0) == -1))) {
-	    attachtty(mypgrp);
-	    adjustwinsize(0);   /* check window size and adjust if necessary */
+	    if (list_pipe) {
+		/*
+		 * Oh, dear, we're right in the middle of some confusion
+		 * of shell jobs on the righthand side of a pipeline, so
+		 * it's death to call attachtty() just yet.  Mark the
+		 * fact in the job, so that the attachtty() will be called
+		 * when the job is finally deleted.
+		 */
+		jn->stat |= STAT_ATTACH;
+	    } else {
+		attachtty(mypgrp);
+		/* check window size and adjust if necessary */
+		adjustwinsize(0);
+	    }
 	}
     }
 
@@ -611,6 +623,11 @@
 deletejob(Job jn)
 {
     struct process *pn, *nx;
+
+    if (jn->stat & STAT_ATTACH) {
+	attachtty(mypgrp);
+	adjustwinsize(0);
+    }
 
     pn = jn->procs;
     jn->procs = NULL;
--- Src/zsh.h.try3	Sat May  8 14:31:51 1999
+++ Src/zsh.h	Tue May 11 14:54:58 1999
@@ -611,6 +611,7 @@
 #define STAT_CURSH	(1<<9)	/* last command is in current shell     */
 #define STAT_NOSTTY	(1<<10)	/* the tty settings are not inherited   */
 				/* from this job when it exits.         */
+#define STAT_ATTACH	(1<<11)	/* delay reattaching shell to tty       */
 
 #define SP_RUNNING -1		/* fake status for jobs currently running */
 
-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


  reply	other threads:[~1999-05-11 13:40 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-05-11 11:58 PATCH: tty pgrp problem again Peter Stephenson
1999-05-11 13:15 ` Peter Stephenson [this message]
1999-05-11 15:53 PATCH: tty pgrp problem again: third attempt Sven Wischnowsky

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9905111315.AA24788@ibmth.df.unipi.it \
    --to=pws@ibmth.df.unipi.it \
    --cc=zsh-workers@sunsite.auc.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).