summaryrefslogtreecommitdiffstats
path: root/pym/portage/process.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-03-27 11:28:12 -0700
committerZac Medico <zmedico@gentoo.org>2012-03-27 11:28:12 -0700
commit144c23efbb4e9565debad03c13c5bcab833a8336 (patch)
treeab9093b86335c68e8f425ceb56249b308bceb93a /pym/portage/process.py
parentb344222a9a4dfbd811e196bd755ccbec511d0721 (diff)
downloadportage-144c23efbb4e9565debad03c13c5bcab833a8336.tar.gz
portage-144c23efbb4e9565debad03c13c5bcab833a8336.tar.bz2
portage-144c23efbb4e9565debad03c13c5bcab833a8336.zip
Close fewer file descriptors for fork / no exec.
This will fix bug #374335.
Diffstat (limited to 'pym/portage/process.py')
-rw-r--r--pym/portage/process.py14
1 files changed, 13 insertions, 1 deletions
diff --git a/pym/portage/process.py b/pym/portage/process.py
index 94687eaa0..f3cec8815 100644
--- a/pym/portage/process.py
+++ b/pym/portage/process.py
@@ -401,7 +401,19 @@ def _exec(binary, mycommand, opt_name, fd_pipes, env, gid, groups, uid, umask,
os.execve(binary, myargs, env)
def _setup_pipes(fd_pipes, close_fds=True):
- """Setup pipes for a forked process."""
+ """Setup pipes for a forked process.
+
+ WARNING: When not followed by exec, the close_fds behavior
+ can trigger interference from destructors that close file
+ descriptors. This interference happens when the garbage
+ collector intermittently executes such destructors after their
+ corresponding file descriptors have been re-used, leading
+ to intermittent "[Errno 9] Bad file descriptor" exceptions in
+ forked processes. This problem has been observed with PyPy 1.8,
+ and also with CPython under some circumstances (as triggered
+ by xmpppy in bug #374335). In order to close a safe subset of
+ file descriptors, see portage.locks._close_fds().
+ """
my_fds = {}
# To protect from cases where direct assignment could
# clobber needed fds ({1:2, 2:1}) we first dupe the fds