gh-140544: store pointer to interpreter state as a thread local for fast access (#140573)

This commit is contained in:
Kumar Aditya 2025-10-25 19:56:07 +05:30 committed by GitHub
parent 4ad599501f
commit ef4665f918
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 22 additions and 8 deletions

View file

@ -78,6 +78,10 @@ _Py_thread_local PyThreadState *_Py_tss_tstate = NULL;
also known as a "gilstate." */
_Py_thread_local PyThreadState *_Py_tss_gilstate = NULL;
/* The interpreter of the attached thread state,
and is same as tstate->interp. */
_Py_thread_local PyInterpreterState *_Py_tss_interp = NULL;
static inline PyThreadState *
current_fast_get(void)
{
@ -89,12 +93,15 @@ current_fast_set(_PyRuntimeState *Py_UNUSED(runtime), PyThreadState *tstate)
{
assert(tstate != NULL);
_Py_tss_tstate = tstate;
assert(tstate->interp != NULL);
_Py_tss_interp = tstate->interp;
}
static inline void
current_fast_clear(_PyRuntimeState *Py_UNUSED(runtime))
{
_Py_tss_tstate = NULL;
_Py_tss_interp = NULL;
}
#define tstate_verify_not_active(tstate) \
@ -1281,9 +1288,8 @@ _PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required)
PyInterpreterState*
PyInterpreterState_Get(void)
{
PyThreadState *tstate = current_fast_get();
_Py_EnsureTstateNotNULL(tstate);
PyInterpreterState *interp = tstate->interp;
_Py_AssertHoldsTstate();
PyInterpreterState *interp = _Py_tss_interp;
if (interp == NULL) {
Py_FatalError("no current interpreter");
}