zsh-workers
 help / color / mirror / code / Atom feed
* Re: tty pgrp and execution and jobs and...
  1999-05-14 12:29 tty pgrp and execution and jobs and Sven Wischnowsky
@ 1999-05-14 12:22 ` Peter Stephenson
  0 siblings, 0 replies; 2+ messages in thread
From: Peter Stephenson @ 1999-05-14 12:22 UTC (permalink / raw)
  To: zsh-workers

Sven Wischnowsky wrote:
> I've played with this execution stuff yesterday and haven't found a
> way to make it fail, so I think we better keep it until we run into
> problems (hm, that's normal behavior w.r.t the job/execution code on
> this list, right?).

I've certainly been acting on that basis.  A lot of these problems you
simply don't notice unless some unusual condition arises, so you have to
rely on `real' users noticing them.

> > But while playing a bit, I found at least one more bug.
> 
> I think I found the reason(s) for this one:

Phew.  I wasn't up to this at all.

-- 
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


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: tty pgrp and execution and jobs and...
@ 1999-05-14 12:29 Sven Wischnowsky
  1999-05-14 12:22 ` Peter Stephenson
  0 siblings, 1 reply; 2+ messages in thread
From: Sven Wischnowsky @ 1999-05-14 12:29 UTC (permalink / raw)
  To: zsh-workers


Peter Stephenson wrote:

> 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).

I've played with this execution stuff yesterday and haven't found a
way to make it fail, so I think we better keep it until we run into
problems (hm, that's normal behavior w.r.t the job/execution code on
this list, right?).

I wrote:

> But while playing a bit, I found at least one more bug. If you do:
> `ls | if true; then sleep 10; cat; fi' and ^Z the sleep, then fg the
> whole thing again, the shell doesn't get hold of the terminal again
> after the cat finishes. If you bg before the fg, the cat doesn't get
> control (and neither does the shell).

I think I found the reason(s) for this one: in exec.c, list_pipe_pid
was reset to zero before reaching line 808 where it is stored in the
process list of the super-job. With the zero stored there findproc()
couldn't find the job when the sub-shell finished and thus the parent
shell didn't realise that it's foreground job had just finished.
Another problem was that waitjob() deleted the sub-job as soon as the
sleep was stopped. With that the parent shell couldn't continue the
sub-job any more.

As a reply to 6277: this seems to be fixed in pws-18, but sometimes I
need to type ^Z twice to get the thing stopped. Currently I have no
idea whence this comes and I won't have time to look at it again until 
next week.

Bye
 Sven

P.S.: This patch also works with 3.0.6.


diff -u os/exec.c Src/exec.c
--- os/exec.c	Tue May 11 13:40:33 1999
+++ Src/exec.c	Thu May 13 15:35:39 1999
@@ -761,13 +761,17 @@
 	coprocout = opipe[1];
 	fdtable[coprocin] = fdtable[coprocout] = 0;
     }
+    /* This used to set list_pipe_pid=0 unconditionally, but in things
+     * like `ls|if true; then sleep 20; cat; fi' where the sleep was
+     * stopped, the top-level execpline() didn't get the pid for the
+     * sub-shell because it was overwritten. */
     if (!pline_level++) {
 	list_pipe_job = newjob;
+        list_pipe_pid = 0;
 	nowait = 0;
-    }
-    list_pipe_pid = lastwj = 0;
-    if (pline_level == 1)
 	simple_pline = (l->left->type == END);
+    }
+    lastwj = 0;
     execpline2(l->left, how, opipe[0], ipipe[1], last1);
     pline_level--;
     if (how & Z_ASYNC) {
@@ -800,6 +804,7 @@
 		    struct process *pn, *qn;
 
 		    curjob = newjob;
+		    DPUTS(!list_pipe_pid, "invalid list_pipe_pid");
 		    addproc(list_pipe_pid, list_pipe_text);
 
 		    for (pn = jobtab[jn->other].procs; pn; pn = pn->next)
diff -u os/jobs.c Src/jobs.c
--- os/jobs.c	Tue May 11 15:01:35 1999
+++ Src/jobs.c	Thu May 13 15:46:02 1999
@@ -765,8 +765,15 @@
 			}
 		    if (!p) {
 			jn->stat &= ~STAT_SUPERJOB;
+			/* This deleted the job too early if the parent
+			   shell waited for a command in list that will
+			   be executed by the sub-shell (e.g.: if we have
+			   `ls|if true;then sleep 20;cat;fi' and ^Z the
+			   sleep, the rest will be executed by a sub-shell,
+			   but the parent shell gets notified for the
+			   sleep.
+			   deletejob(sj); */
 			kill(sj->other, SIGCONT);
-			deletejob(sj);
 		    }
 		    curjob = jn - jobtab;
 		}

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1999-05-14 12:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-05-14 12:29 tty pgrp and execution and jobs and Sven Wischnowsky
1999-05-14 12:22 ` Peter Stephenson

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).