diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-12-07 20:35:43 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-12-07 20:35:43 (GMT) |
commit | 25059d30c39c0c703161987643f0c29df03147fb (patch) | |
tree | de22166aa881073d0d001153d3d7dd45046db067 | |
parent | 2f09812efa0701721825b17086de3631462039a6 (diff) | |
download | cpython-25059d30c39c0c703161987643f0c29df03147fb.zip cpython-25059d30c39c0c703161987643f0c29df03147fb.tar.gz cpython-25059d30c39c0c703161987643f0c29df03147fb.tar.bz2 |
SF patch #489173: Make os.spawnv not block the interpreter, from
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.
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 7 | ||||
-rw-r--r-- | Modules/posixmodule.c | 13 |
3 files changed, 18 insertions, 3 deletions
@@ -353,6 +353,7 @@ Jan Pieter Riegel Armin Rigo Nicholas Riley Jean-Claude Rimbault +Anthony Roach Andy Robinson Jim Robinson Kevin Rodgers @@ -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. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index bb55762..ebda8bf 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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 |