|
|
|
@ -549,7 +549,9 @@ subprocess_fork_exec(PyObject* self, PyObject *args) |
|
|
|
int need_to_reenable_gc = 0; |
|
|
|
char *const *exec_array, *const *argv = NULL, *const *envp = NULL; |
|
|
|
Py_ssize_t arg_num; |
|
|
|
#ifdef WITH_THREAD |
|
|
|
int import_lock_held = 0; |
|
|
|
#endif |
|
|
|
|
|
|
|
if (!PyArg_ParseTuple( |
|
|
|
args, "OOpOOOiiiiiiiiiiO:fork_exec", |
|
|
|
@ -644,8 +646,10 @@ subprocess_fork_exec(PyObject* self, PyObject *args) |
|
|
|
preexec_fn_args_tuple = PyTuple_New(0); |
|
|
|
if (!preexec_fn_args_tuple) |
|
|
|
goto cleanup; |
|
|
|
#ifdef WITH_THREAD |
|
|
|
_PyImport_AcquireLock(); |
|
|
|
import_lock_held = 1; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
if (cwd_obj != Py_None) { |
|
|
|
@ -688,12 +692,14 @@ subprocess_fork_exec(PyObject* self, PyObject *args) |
|
|
|
/* Capture the errno exception before errno can be clobbered. */ |
|
|
|
PyErr_SetFromErrno(PyExc_OSError); |
|
|
|
} |
|
|
|
if (preexec_fn != Py_None && |
|
|
|
_PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) { |
|
|
|
#ifdef WITH_THREAD |
|
|
|
if (preexec_fn != Py_None |
|
|
|
&& _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) { |
|
|
|
PyErr_SetString(PyExc_RuntimeError, |
|
|
|
"not holding the import lock"); |
|
|
|
} |
|
|
|
import_lock_held = 0; |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Parent process */ |
|
|
|
if (envp) |
|
|
|
@ -716,8 +722,10 @@ subprocess_fork_exec(PyObject* self, PyObject *args) |
|
|
|
return PyLong_FromPid(pid); |
|
|
|
|
|
|
|
cleanup: |
|
|
|
#ifdef WITH_THREAD |
|
|
|
if (import_lock_held) |
|
|
|
_PyImport_ReleaseLock(); |
|
|
|
#endif |
|
|
|
if (envp) |
|
|
|
_Py_FreeCharPArray(envp); |
|
|
|
if (argv) |
|
|
|
|