summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-util/scons/files/scons-1.2.0-popen.patch')
-rw-r--r--dev-util/scons/files/scons-1.2.0-popen.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/dev-util/scons/files/scons-1.2.0-popen.patch b/dev-util/scons/files/scons-1.2.0-popen.patch
new file mode 100644
index 000000000000..23063cffd0c5
--- /dev/null
+++ b/dev-util/scons/files/scons-1.2.0-popen.patch
@@ -0,0 +1,58 @@
+--- engine/SCons/compat/__init__.py (revision 2695)
++++ engine/SCons/compat/__init__.py (working copy)
+@@ -167,11 +167,17 @@
+ del shlex
+ import_as('_scons_shlex', 'shlex')
+
+-try:
+- import subprocess
+-except ImportError:
+- # Pre-2.4 Python has no subprocess module.
+- import_as('_scons_subprocess', 'subprocess')
++#try:
++# import subprocess
++#except ImportError:
++# # Pre-2.4 Python has no subprocess module.
++# import_as('_scons_subprocess', 'subprocess')
++
++# Import subprocess unconditionally to avoid possible race conditions in
++# the official subprocess API. If there are API versions without known
++# problems, we can version-check and use the original subprocess module
++# in these cases.
++import_as('_scons_subprocess', 'subprocess')
+
+ import sys
+ try:
+
+
+--- engine/SCons/compat/_scons_subprocess.py (revision 2695)
++++ engine/SCons/compat/_scons_subprocess.py (working copy)
+@@ -581,13 +581,19 @@
+ class object:
+ pass
+
++import thread
++lock = thread.allocate_lock()
++
+ class Popen(object):
+ def __init__(self, args, bufsize=0, executable=None,
+ stdin=None, stdout=None, stderr=None,
+ preexec_fn=None, close_fds=False, shell=False,
+ cwd=None, env=None, universal_newlines=False,
+ startupinfo=None, creationflags=0):
+- """Create new Popen instance."""
++ """Create new Popen instance.
++ Popen is not thread-safe and is therefore protected with a lock.
++ """
++ lock.acquire()
+ _cleanup()
+
+ self._child_created = False
+@@ -655,6 +661,7 @@
+ self.stderr = os.fdopen(errread, 'rU', bufsize)
+ else:
+ self.stderr = os.fdopen(errread, 'rb', bufsize)
++ lock.release()
+
+
+ def _translate_newlines(self, data):