Kaydet (Commit) b7fe432a authored tarafından Guido van Rossum's avatar Guido van Rossum

Fix by Donn Cave for BeOS (SF #403642):

  UNIX style fork/execve/wait are not fully compatible with thread
  support on BeOS.  For Python, that means neither fork() from import
  nor import from a fork work reliably. os._execvpe() does the latter,
  importing tempfile to set up a tantalizing target for hackers. This
  patch replaces both the tempfile name generation and the exec that
  uses it, in case we're on BeOS. Need this for
  setup:distutils:execvp(); symptoms are random crashes and internal
  BeOS error messages about th name, in case we're on BeOS. It's an
  issue because setup.py + distutils calls os.execvp(); symptoms are
  random crashes during setup.py, and internal BeOS error messages
  about thread IDs.
üst 258ccd41
......@@ -322,10 +322,19 @@ def _execvpe(file, args, env=None):
envpath = defpath
PATH = envpath.split(pathsep)
if not _notfound:
import tempfile
# Exec a file that is guaranteed not to exist
try: execv(tempfile.mktemp(), ('blah',))
except error, _notfound: pass
if sys.platform[:4] == 'beos':
# Process handling (fork, wait) under BeOS (up to 5.0)
# doesn't interoperate reliably with the thread interlocking
# that happens during an import. The actual error we need
# is the same on BeOS for posix.open() et al., ENOENT.
try: unlink('/_#.# ## #.#')
except error, _notfound: pass
else:
import tempfile
t = tempfile.mktemp()
# Exec a file that is guaranteed not to exist
try: execv(t, ('blah',))
except error, _notfound: pass
exc, arg = error, _notfound
for dir in PATH:
fullname = path.join(dir, file)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment