mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-01 21:51:40 +02:00
31536 with additions: Fix hang in previous process substitution fix.
Close applicable file descriptors when waiting for a job.
This commit is contained in:
parent
3c5732223f
commit
cda21a28e6
3 changed files with 40 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
|||
2013-07-19 Peter Stephenson <p.stephenson@samsung.com>
|
||||
|
||||
* 31536 (plus memory leak fixed, plus test code):
|
||||
Src/jobs.c, Test/D03procsubst.ztst: fix hang in 31528 by
|
||||
closing process substitution file descriptors when waiting
|
||||
for job to finish.
|
||||
|
||||
2013-07-17 Peter Stephenson <p.w.stephenson@ntlworld.com>
|
||||
|
||||
* 31528: Src/exec.c, Src/jobs.c, Src/zsh.h: use job table
|
||||
|
|
25
Src/jobs.c
25
Src/jobs.c
|
@ -1368,6 +1368,31 @@ zwaitjob(int job, int wait_cmd)
|
|||
jn->stat |= STAT_LOCKED;
|
||||
if (jn->stat & STAT_CHANGED)
|
||||
printjob(jn, !!isset(LONGLISTJOBS), 1);
|
||||
if (jn->filelist) {
|
||||
/*
|
||||
* The main shell is finished with any file descriptors used
|
||||
* for process substitution associated with this job: close
|
||||
* them to indicate to listeners there's no more input.
|
||||
*
|
||||
* Note we can't safely delete temporary files yet as these
|
||||
* are directly visible to other processes. However,
|
||||
* we can't deadlock on the fact that those still exist, so
|
||||
* that's not a problem.
|
||||
*/
|
||||
LinkNode node = firstnode(jn->filelist);
|
||||
while (node) {
|
||||
Jobfile jf = (Jobfile)getdata(node);
|
||||
if (jf->is_fd) {
|
||||
LinkNode next = nextnode(node);
|
||||
(void)remnode(jn->filelist, node);
|
||||
zclose(jf->u.fd);
|
||||
zfree(jf, sizeof(*jf));
|
||||
node = next;
|
||||
} else {
|
||||
incnode(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
while (!errflag && jn->stat &&
|
||||
!(jn->stat & STAT_DONE) &&
|
||||
!(interact && (jn->stat & STAT_STOPPED))) {
|
||||
|
|
|
@ -107,3 +107,11 @@
|
|||
>third: This becomes argument three
|
||||
>fourth: and this argument four
|
||||
|
||||
() {
|
||||
# Make sure we don't close the file descriptor too early
|
||||
eval 'print "Execute a complicated command first" | sed s/command/order/'
|
||||
cat $1
|
||||
} <(echo This line was brought to you by the letters F and D)
|
||||
0:Process substitution as anonymous function argument
|
||||
>Execute a complicated order first
|
||||
>This line was brought to you by the letters F and D
|
||||
|
|
Loading…
Reference in a new issue