summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-03-10 00:37:48 +0100
committerGitHub <noreply@github.com>2020-03-10 00:37:48 +0100
commit175a704abfcb3400aaeb66d4f098d92ca7e30892 (patch)
tree69632e4e77cf0a397bbe51cdc15d6f0624ef1cf9 /Python
parentaddaaaa946855ad59c8f5c698aa0891d7e44f018 (diff)
downloadcpython-git-175a704abfcb3400aaeb66d4f098d92ca7e30892.tar.gz
bpo-39877: PyGILState_Ensure() don't call PyEval_InitThreads() (GH-18891)
PyGILState_Ensure() doesn't call PyEval_InitThreads() anymore when a new Python thread state is created. The GIL is created by Py_Initialize() since Python 3.7, it's not needed to call PyEval_InitThreads() explicitly. Add an assertion to ensure that the GIL is already created.
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c8
-rw-r--r--Python/pystate.c32
2 files changed, 20 insertions, 20 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 72a830468f..0ee740ace3 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -199,10 +199,16 @@ ensure_tstate_not_null(const char *func, PyThreadState *tstate)
int
+_PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
+{
+ return gil_created(&runtime->ceval.gil);
+}
+
+int
PyEval_ThreadsInitialized(void)
{
_PyRuntimeState *runtime = &_PyRuntime;
- return gil_created(&runtime->ceval.gil);
+ return _PyEval_ThreadsInitialized(runtime);
}
PyStatus
diff --git a/Python/pystate.c b/Python/pystate.c
index f907fc1fc9..a926e9753c 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1280,27 +1280,28 @@ PyGILState_Check(void)
PyGILState_STATE
PyGILState_Ensure(void)
{
- struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
- int current;
- PyThreadState *tcur;
- int need_init_threads = 0;
+ _PyRuntimeState *runtime = &_PyRuntime;
+ struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
/* Note that we do not auto-init Python here - apart from
potential races with 2 threads auto-initializing, pep-311
spells out other issues. Embedders are expected to have
- called Py_Initialize() and usually PyEval_InitThreads().
- */
- /* Py_Initialize() hasn't been called! */
+ called Py_Initialize(). */
+
+ /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been
+ called by Py_Initialize() */
+ assert(_PyEval_ThreadsInitialized(runtime));
assert(gilstate->autoInterpreterState);
- tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
+ PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
+ int current;
if (tcur == NULL) {
- need_init_threads = 1;
-
- /* Create a new thread state for this thread */
+ /* Create a new Python thread state for this thread */
tcur = PyThreadState_New(gilstate->autoInterpreterState);
- if (tcur == NULL)
+ if (tcur == NULL) {
Py_FatalError("Couldn't create thread-state for new thread");
+ }
+
/* This is our thread state! We'll need to delete it in the
matching call to PyGILState_Release(). */
tcur->gilstate_counter = 0;
@@ -1321,13 +1322,6 @@ PyGILState_Ensure(void)
*/
++tcur->gilstate_counter;
- if (need_init_threads) {
- /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
- called from a new thread for the first time, we need the create the
- GIL. */
- PyEval_InitThreads();
- }
-
return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
}