summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2018-01-29 10:57:45 (GMT)
committerGitHub <noreply@github.com>2018-01-29 10:57:45 (GMT)
commit2914bb32e2adf8dff77c0ca58b33201bc94e398c (patch)
tree1a2e9e064f9dbc362c2b3c5bbb52affadaa448fa /Python/ceval.c
parent8997f9cd1a59f04fbb8c7b590295a9f38c548744 (diff)
downloadcpython-2914bb32e2adf8dff77c0ca58b33201bc94e398c.zip
cpython-2914bb32e2adf8dff77c0ca58b33201bc94e398c.tar.gz
cpython-2914bb32e2adf8dff77c0ca58b33201bc94e398c.tar.bz2
bpo-20891: Py_Initialize() now creates the GIL (#4700)
The GIL is no longer created "on demand" to fix a race condition when PyGILState_Ensure() is called in a non-Python thread.
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 128ec2c..52a42b0 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -254,8 +254,8 @@ PyEval_SaveThread(void)
PyThreadState *tstate = PyThreadState_Swap(NULL);
if (tstate == NULL)
Py_FatalError("PyEval_SaveThread: NULL tstate");
- if (gil_created())
- drop_gil(tstate);
+ assert(gil_created());
+ drop_gil(tstate);
return tstate;
}
@@ -264,17 +264,18 @@ PyEval_RestoreThread(PyThreadState *tstate)
{
if (tstate == NULL)
Py_FatalError("PyEval_RestoreThread: NULL tstate");
- if (gil_created()) {
- int err = errno;
- take_gil(tstate);
- /* _Py_Finalizing is protected by the GIL */
- if (_Py_IsFinalizing() && !_Py_CURRENTLY_FINALIZING(tstate)) {
- drop_gil(tstate);
- PyThread_exit_thread();
- Py_UNREACHABLE();
- }
- errno = err;
+ assert(gil_created());
+
+ int err = errno;
+ take_gil(tstate);
+ /* _Py_Finalizing is protected by the GIL */
+ if (_Py_IsFinalizing() && !_Py_CURRENTLY_FINALIZING(tstate)) {
+ drop_gil(tstate);
+ PyThread_exit_thread();
+ Py_UNREACHABLE();
}
+ errno = err;
+
PyThreadState_Swap(tstate);
}