summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/EbuildFetcher.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-02-14 04:29:02 -0800
committerZac Medico <zmedico@gentoo.org>2012-02-14 04:29:02 -0800
commita75341bf3a66f75edd68d1a8bc5efdb51c0c0740 (patch)
tree731f6f1bb4840d83b128d4401b052a8377818961 /pym/_emerge/EbuildFetcher.py
parentfe3960b69c326bc779bdf5ec34d56630b3e188ae (diff)
downloadportage-a75341bf3a66f75edd68d1a8bc5efdb51c0c0740.tar.gz
portage-a75341bf3a66f75edd68d1a8bc5efdb51c0c0740.tar.bz2
portage-a75341bf3a66f75edd68d1a8bc5efdb51c0c0740.zip
After python fork, don't close fds for PyPy 1.8.
If we close all open file descriptors after a fork, with PyPy 1.8 it triggers "[Errno 9] Bad file descriptor" later in the subprocess. Apparently it is holding references to file descriptors and closing them after they've already been closed and re-opened for other purposes. As a workaround, we don't close the file descriptors, so that they won't be re-used and therefore we won't be vulnerable to this kind of interference. The obvious caveat of not closing the fds is that the subprocess can hold locks that belonged to the parent process, even after the parent process has released the locks. Hopefully this won't be a major problem though, since the subprocess has to exit at release the lock eventually, when the EbuildFetcher or _MergeProcess task is complete.
Diffstat (limited to 'pym/_emerge/EbuildFetcher.py')
-rw-r--r--pym/_emerge/EbuildFetcher.py6
1 files changed, 5 insertions, 1 deletions
diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py
index 61c7848ad..6ad434129 100644
--- a/pym/_emerge/EbuildFetcher.py
+++ b/pym/_emerge/EbuildFetcher.py
@@ -6,6 +6,7 @@ import traceback
from _emerge.SpawnProcess import SpawnProcess
import copy
import io
+import platform
import signal
import sys
import portage
@@ -166,7 +167,10 @@ class EbuildFetcher(SpawnProcess):
portage.process.spawned_pids.append(pid)
return [pid]
- portage.process._setup_pipes(fd_pipes)
+ # TODO: Find out why PyPy 1.8 with close_fds=True triggers
+ # "[Errno 9] Bad file descriptor" in subprocesses.
+ close_fds = platform.python_implementation() != 'PyPy'
+ portage.process._setup_pipes(fd_pipes, close_fds=close_fds)
# Use default signal handlers in order to avoid problems
# killing subprocesses as reported in bug #353239.