backport r60104 + r60111 from trunk.

- Issue #1336: fix a race condition in subprocess.Popen if the garbage
  collector kicked in at the wrong time that would cause the process
  to hang when the child wrote to stderr.
This commit is contained in:
Gregory P. Smith 2008-01-19 22:29:41 +00:00
parent af81c576ea
commit c223c6cb41
2 changed files with 17 additions and 1 deletions

View file

@ -358,6 +358,7 @@ mswindows = (sys.platform == "win32")
import os import os
import types import types
import traceback import traceback
import gc
# Exception classes used by this module. # Exception classes used by this module.
class CalledProcessError(Exception): class CalledProcessError(Exception):
@ -1002,7 +1003,16 @@ class Popen(object):
errpipe_read, errpipe_write = os.pipe() errpipe_read, errpipe_write = os.pipe()
self._set_cloexec_flag(errpipe_write) self._set_cloexec_flag(errpipe_write)
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = os.fork() self.pid = os.fork()
except:
if gc_was_enabled:
gc.enable()
raise
self._child_created = True self._child_created = True
if self.pid == 0: if self.pid == 0:
# Child # Child
@ -1062,6 +1072,8 @@ class Popen(object):
os._exit(255) os._exit(255)
# Parent # Parent
if gc_was_enabled:
gc.enable()
os.close(errpipe_write) os.close(errpipe_write)
if p2cread and p2cwrite: if p2cread and p2cwrite:
os.close(p2cread) os.close(p2cread)

View file

@ -53,6 +53,10 @@ Core and builtins
Library Library
------- -------
- Issue #1336: fix a race condition in subprocess.Popen if the garbage
collector kicked in at the wrong time that would cause the process
to hang when the child wrote to stderr.
- Bug #1687: Fixed plistlib.py restricts <integer> to Python int when writing. - Bug #1687: Fixed plistlib.py restricts <integer> to Python int when writing.
- Issue #1182: many arithmetic bugs in the decimal module have been - Issue #1182: many arithmetic bugs in the decimal module have been