Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Shell job structure



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@xxxxxxxxxxxxxxxx> 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.



Messages sorted by: Reverse Date, Date, Thread, Author