summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-12-01 21:26:08 +0000
committerZac Medico <zmedico@gentoo.org>2007-12-01 21:26:08 +0000
commit9b8c9ad276e6578dd1deefd3599aadd1d097e700 (patch)
tree973a2cdafee6dd1e9d9eedfa1465c5d633d64aa4
parenteb9bbd0705ee69873302fd8446227ee945ed60a1 (diff)
downloadportage-9b8c9ad276e6578dd1deefd3599aadd1d097e700.tar.gz
portage-9b8c9ad276e6578dd1deefd3599aadd1d097e700.tar.bz2
portage-9b8c9ad276e6578dd1deefd3599aadd1d097e700.zip
After each merge, collect status from child processes
in order to clean up zombies (such as the parallel-fetch process). (trunk r8790:8792) svn path=/main/branches/2.1.2/; revision=8793
-rwxr-xr-xbin/emerge36
1 files changed, 34 insertions, 2 deletions
diff --git a/bin/emerge b/bin/emerge
index 6c3bf2b18..03dc11dd5 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -3649,8 +3649,37 @@ class MergeTask(object):
self.pkgsettings["/"] = \
portage.config(clone=trees["/"]["vartree"].settings)
self.curval = 0
+ self._spawned_pids = []
def merge(self, mylist, favorites, mtimedb):
+ try:
+ return self._merge(mylist, favorites, mtimedb)
+ finally:
+ if self._spawned_pids:
+ from portage import process
+ process.spawned_pids.extend(self._spawned_pids)
+ self._spawned_pids = []
+
+ def _poll_child_processes(self):
+ """
+ After each merge, collect status from child processes
+ in order to clean up zombies (such as the parallel-fetch
+ process).
+ """
+ spawned_pids = self._spawned_pids
+ if not spawned_pids:
+ return
+ for pid in list(spawned_pids):
+ try:
+ if os.waitpid(pid, os.WNOHANG) == (0, 0):
+ continue
+ except OSError:
+ # This pid has been cleaned up elsewhere,
+ # so remove it from our list.
+ pass
+ spawned_pids.remove(pid)
+
+ def _merge(self, mylist, favorites, mtimedb):
failed_fetches = []
fetchonly = "--fetchonly" in self.myopts or \
"--fetch-all-uri" in self.myopts
@@ -3755,8 +3784,10 @@ class MergeTask(object):
fetch_args.append(myopt)
else:
fetch_args.append(myopt +"="+ myarg)
- portage.portage_exec.spawn(fetch_args, env=fetch_env,
- fd_pipes=fd_pipes, returnpid=True)
+ self._spawned_pids.extend(
+ portage.portage_exec.spawn(
+ fetch_args, env=fetch_env,
+ fd_pipes=fd_pipes, returnpid=True))
logfile.close() # belongs to the spawned process
del fetch_log, logfile, fd_pipes, fetch_env, fetch_args, \
resume_opts
@@ -4087,6 +4118,7 @@ class MergeTask(object):
# due to power failure, SIGKILL, etc...
mtimedb.commit()
self.curval += 1
+ self._poll_child_processes()
if "--pretend" not in self.myopts:
emergelog(xterm_titles, " *** Finished. Cleaning up...")