zsh-workers
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-workers@zsh.org
Subject: Re: Shell job structure
Date: Fri, 25 Oct 2013 08:13:11 -0700	[thread overview]
Message-ID: <131025081311.ZM9080@torch.brasslantern.com> (raw)
In-Reply-To: <20131025110056.1757a5ab@pwslap01u.europe.root.pri>

On Oct 25, 11:00am, Peter Stephenson wrote:
} Subject: Re: Shell job structure
}
} On Thu, 24 Oct 2013 22:02:14 -0700
} Bart Schaefer <schaefer@brasslantern.com> wrote:
} > } The job table would become a list of top-level jobs, while the job
} > } structure would have pointers to nested jobs.
} > 
} > As I mentioned elsewhere, the procs list and "other" pointer into the
} > job table serve this function.
} > 
} > It still might be done more cleanly, but at least we avoided a full
} > rewrite for now.
} 
} There's a wider problem of what happens inside nested control
} structures, in particular functions.  Consider what happens when you use
} "pipestatus" inside a function, and then try to apply it to a pipeline,
} that happens to run that function at the right hand end, after the whole
} pipeline has finished.

You mean like this?

% true | false | true | (){ false | true | false; print $pipestatus }; print $pipestatus
1 0 1
0 1 0 0

Here's a loop construct:

% false | true | false | while true | false | true; do print $pipestatus; break; done; print $pipestatus
0 1 0
1 0 1 0

If that's not what you mean, then I'm not sure what is expected here.

} Logically, at least, this requires some kind of
} hierarchical handling of jobs, not processes --- although simply saving
} and restoring the current job might be good enough.  Does the current
} system take account of this kind of thing properly?

After 31879+31885, pipestats isn't assigned until the Job object is
deleted (which only happens after all parts of the job are finished)
*except* in one case: the job was suspended.  I'm pretty sure there is
still a race condition in that circumstance wherein the parent shell
may decide the current-shell task is done because a component process
hasn't yet received the signal.

Anyway, the point is that if the outer pipeline doesn't assign pipestats
until the current-shell construct at the tail has completed, then it's
theoretically safe to use $pipstatus for pipelines inside that construct.

} If so, maybe things are better than I thought.

One thing I still don't understand about this is the exactly when the
STAT_SUPERJOB flag is applied and whether that's going to affect some
case that we haven't yet thought to test.  There's a huge comment in
exec.c that attempts to explain it, but ...

There's a complication in that exec.c also says --

                        /* If this job has finished, we leave it as a
                         * normal (non-super-) job. */

-- which I'm afraid might complicate the handling of pipestats in a way
we're not expecting.  This is all probably related to the race condition
that I just mentioned, and indeed the big comment ends with:

 * The code for all this is distributed over three files (exec.c, jobs.c,
 * and signals.c) and none of them is a simple one. So, all in all, there
 * may still be bugs, but considering the complexity (with race conditions,
 * signal handling, and all that), this should probably be expected.


  reply	other threads:[~2013-10-25 15:13 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CADv1Z=pM7H4Xg9+GyWd4zw0cv0mXfbJvqip6vc7e_yrXRN=1sg@mail.gmail.com>
     [not found] ` <20131005223159.25fea6a0@pws-pc.ntlworld.com>
2013-10-07  0:36   ` No pipefail option? Bart Schaefer
2013-10-07  9:25     ` Peter Stephenson
2013-10-07 14:40       ` Bart Schaefer
2013-10-08 20:44         ` Shell job structure Peter Stephenson
2013-10-25  5:02           ` Bart Schaefer
2013-10-25 10:00             ` Peter Stephenson
2013-10-25 15:13               ` Bart Schaefer [this message]
2013-10-25 15:21                 ` Peter Stephenson
2013-10-25 17:04                   ` Bart Schaefer

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=131025081311.ZM9080@torch.brasslantern.com \
    --to=schaefer@brasslantern.com \
    --cc=zsh-workers@zsh.org \
    /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).