From aede5c52bf557f89d1d09fa5430186af6e295241 Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Sat, 21 Dec 2013 17:41:21 -0800
Subject: 32176: plug additional deadlock-inducing pipe descriptor leaks
---
Src/jobs.c | 38 +++++++++++++++++++++++++-------------
1 file changed, 25 insertions(+), 13 deletions(-)
(limited to 'Src/jobs.c')
diff --git a/Src/jobs.c b/Src/jobs.c
index 371b8eb32..a32117217 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1173,6 +1173,30 @@ addfilelist(const char *name, int fd)
zaddlinknode(ll, jf);
}
+/* Clean up pipes no longer needed associated with a job */
+
+/**/
+void
+pipecleanfilelist(LinkList filelist)
+{
+ LinkNode node;
+
+ if (!filelist)
+ return;
+ node = firstnode(filelist);
+ while (node) {
+ Jobfile jf = (Jobfile)getdata(node);
+ if (jf->is_fd) {
+ LinkNode next = nextnode(node);
+ zclose(jf->u.fd);
+ (void)remnode(filelist, node);
+ zfree(jf, sizeof(*jf));
+ node = next;
+ } else
+ incnode(node);
+ }
+}
+
/* Finished with list of files for a job */
/**/
@@ -1415,19 +1439,7 @@ zwaitjob(int job, int wait_cmd)
* 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);
- }
- }
+ pipecleanfilelist(jn->filelist);
}
while (!errflag && jn->stat &&
!(jn->stat & STAT_DONE) &&
--
cgit 1.4.1