diff options
author | Eric Snow <ericsnowcurrently@gmail.com> | 2021-12-08 00:26:29 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-08 00:26:29 (GMT) |
commit | 1f384e318481532323bb9076f4447bc02da07209 (patch) | |
tree | 41a6930e45fffdae2fa98b83fc1c94f3087115bd | |
parent | 9b577cd01f66512b503115c0fdbf0734edfd5f8a (diff) | |
download | cpython-1f384e318481532323bb9076f4447bc02da07209.zip cpython-1f384e318481532323bb9076f4447bc02da07209.tar.gz cpython-1f384e318481532323bb9076f4447bc02da07209.tar.bz2 |
bpo-46008: Stop calling _PyThreadState_Init() in new_threadstate(). (gh-29973)
This simplifies new_threadstate(). We also rename _PyThreadState_Init() to _PyThreadState_SetCurrent() to reflect what it actually does.
https://bugs.python.org/issue46008
-rw-r--r-- | Include/internal/pycore_pystate.h | 2 | ||||
-rw-r--r-- | Modules/_threadmodule.c | 4 | ||||
-rw-r--r-- | Python/pystate.c | 20 |
3 files changed, 17 insertions, 9 deletions
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 9a570b0..f139fa9 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -127,6 +127,8 @@ static inline PyInterpreterState* _PyInterpreterState_GET(void) { // PyThreadState functions +PyAPI_FUNC(void) _PyThreadState_SetCurrent(PyThreadState *tstate); +// We keep this around exclusively for stable ABI compatibility. PyAPI_FUNC(void) _PyThreadState_Init( PyThreadState *tstate); PyAPI_FUNC(void) _PyThreadState_DeleteExcept( diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 2ba081d..cde2e0b 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -6,7 +6,7 @@ #include "pycore_interp.h" // _PyInterpreterState.threads.count #include "pycore_moduleobject.h" // _PyModule_GetState() #include "pycore_pylifecycle.h" -#include "pycore_pystate.h" // _PyThreadState_Init() +#include "pycore_pystate.h" // _PyThreadState_SetCurrent() #include <stddef.h> // offsetof() #include "structmember.h" // PyMemberDef @@ -1087,7 +1087,7 @@ thread_run(void *boot_raw) #else tstate->native_thread_id = 0; #endif - _PyThreadState_Init(tstate); + _PyThreadState_SetCurrent(tstate); PyEval_AcquireThread(tstate); tstate->interp->threads.count++; diff --git a/Python/pystate.c b/Python/pystate.c index 49acd56..f94019d 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -631,7 +631,7 @@ allocate_chunk(int size_in_bytes, _PyStackChunk* previous) } static PyThreadState * -new_threadstate(PyInterpreterState *interp, int init) +new_threadstate(PyInterpreterState *interp) { _PyRuntimeState *runtime = interp->runtime; PyThreadState *tstate = (PyThreadState *)PyMem_RawCalloc(1, sizeof(PyThreadState)); @@ -662,10 +662,6 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->datastack_top = &tstate->datastack_chunk->data[1]; tstate->datastack_limit = (PyObject **)(((char *)tstate->datastack_chunk) + DATA_STACK_CHUNK_SIZE); - if (init) { - _PyThreadState_Init(tstate); - } - HEAD_LOCK(runtime); tstate->id = ++interp->threads.next_unique_id; tstate->next = interp->threads.head; @@ -680,18 +676,28 @@ new_threadstate(PyInterpreterState *interp, int init) PyThreadState * PyThreadState_New(PyInterpreterState *interp) { - return new_threadstate(interp, 1); + PyThreadState *tstate = new_threadstate(interp); + _PyThreadState_SetCurrent(tstate); + return tstate; } PyThreadState * _PyThreadState_Prealloc(PyInterpreterState *interp) { - return new_threadstate(interp, 0); + return new_threadstate(interp); } +// We keep this around for (accidental) stable ABI compatibility. +// Realisically, no extensions are using it. void _PyThreadState_Init(PyThreadState *tstate) { + Py_FatalError("_PyThreadState_Init() is for internal use only"); +} + +void +_PyThreadState_SetCurrent(PyThreadState *tstate) +{ _PyGILState_NoteThreadState(&tstate->interp->runtime->gilstate, tstate); } |