]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
SF patch #489173: Make os.spawnv not block the interpreter, from
authorTim Peters <tim.peters@gmail.com>
Fri, 7 Dec 2001 20:35:43 +0000 (20:35 +0000)
committerTim Peters <tim.peters@gmail.com>
Fri, 7 Dec 2001 20:35:43 +0000 (20:35 +0000)
Anthony Roach.
Release the global interpreter lock around platform spawn calls.
Bugfix candidate?  Hard to say; I favor "yes, bugfix".
These clearly *should* have been releasing the GIL all along, if for no
other reason than compatibility with the similar os.system().  But it's
possible some program out there is (a) multithreaded, (b) calling a spawn
function with P_WAIT, and (c) relying on the spawn call to block all their
threads until the spawned program completes.  I think it's very unlikely
anyone is doing that on purpose, but someone may be doing so by accident.

Misc/ACKS
Misc/NEWS
Modules/posixmodule.c

index 1ee3f0c9d0579d44bb36f3f3c77eb57703f85a99..e110f15ee6dc02fd5706d2713f50acbe93c33a22 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -353,6 +353,7 @@ Jan Pieter Riegel
 Armin Rigo
 Nicholas Riley
 Jean-Claude Rimbault
+Anthony Roach
 Andy Robinson
 Jim Robinson
 Kevin Rodgers
index 6dd99579fc659c2975734e5f3d2b51d8afaf4413..6df0b52041800d137892911949818480fe98f24d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -52,6 +52,13 @@ Extension modules
 
 Library
 
+- Functions in the os.spawn() family now release the global interpreter
+  lock around calling the platform spawn.  They should always have done
+  this, but did not before 2.2c1.  Multithreaded programs calling
+  an os.spawn function with P_WAIT will no longer block all Python threads
+  until the spawned program completes.  It's possible that some programs
+  relies on blocking, although more likely by accident than by design.
+
 - webbrowser defaults to netscape.exe on OS/2 now.
 
 - Tix.ResizeHandle exposes detach_widget, hide, and show.
index bb557626baed5bd3223c730a6f61627be1236985..ebda8bf909d412b954fe1cd39d56939016019529 100644 (file)
@@ -1668,7 +1668,7 @@ posix_execve(PyObject *self, PyObject *args)
 #ifdef HAVE_SPAWNV
 static char posix_spawnv__doc__[] =
 "spawnv(mode, path, args)\n\
-Execute an executable path with arguments, replacing current process.\n\
+Execute the program 'path' in a new process.\n\
 \n\
        mode: mode of process creation\n\
        path: path of executable file\n\
@@ -1717,8 +1717,11 @@ posix_spawnv(PyObject *self, PyObject *args)
 
        if (mode == _OLD_P_OVERLAY)
                mode = _P_OVERLAY;
+       
+       Py_BEGIN_ALLOW_THREADS
        spawnval = _spawnv(mode, path, argvlist);
-
+       Py_END_ALLOW_THREADS
+       
        PyMem_DEL(argvlist);
 
        if (spawnval == -1)
@@ -1734,7 +1737,7 @@ posix_spawnv(PyObject *self, PyObject *args)
 
 static char posix_spawnve__doc__[] =
 "spawnve(mode, path, args, env)\n\
-Execute a path with arguments and environment, replacing current process.\n\
+Execute the program 'path' in a new process.\n\
 \n\
        mode: mode of process creation\n\
        path: path of executable file\n\
@@ -1830,7 +1833,11 @@ posix_spawnve(PyObject *self, PyObject *args)
 
        if (mode == _OLD_P_OVERLAY)
                mode = _P_OVERLAY;
+
+       Py_BEGIN_ALLOW_THREADS
        spawnval = _spawnve(mode, path, argvlist, envlist);
+       Py_END_ALLOW_THREADS
+
        if (spawnval == -1)
                (void) posix_error();
        else