]> granicus.if.org Git - python/commitdiff
Fix by Donn Cave for BeOS (SF #403642):
authorGuido van Rossum <guido@python.org>
Fri, 2 Mar 2001 07:04:51 +0000 (07:04 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 2 Mar 2001 07:04:51 +0000 (07:04 +0000)
  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.

Lib/os.py

index 201aa9dc167340e8c0fb3466be7838c0e5982cd5..84722af98623c5ee3f5cf3e1c26ffb63a3c828b2 100644 (file)
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -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)