From 144c23efbb4e9565debad03c13c5bcab833a8336 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Tue, 27 Mar 2012 11:28:12 -0700 Subject: Close fewer file descriptors for fork / no exec. This will fix bug #374335. --- pym/portage/process.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'pym/portage/process.py') 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 -- cgit v1.2.3-1-g7c22