bpo-39947: Add PyThreadState_GetInterpreter() (GH-18981)

Add PyThreadState_GetInterpreter(tstate): get the interpreter of a
Python thread state.
This commit is contained in:
Victor Stinner 2020-03-13 23:38:08 +01:00 committed by GitHub
parent be79373a78
commit 8fb02b6e19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 37 additions and 9 deletions

View File

@ -1064,12 +1064,21 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
:c:func:`PyThreadState_Clear`. :c:func:`PyThreadState_Clear`.
.. c:function:: void PyThreadState_DeleteCurrent() .. c:function:: void PyThreadState_DeleteCurrent(void)
Destroy the current thread state and release the global interpreter lock. Destroy the current thread state and release the global interpreter lock.
Like :c:func:`PyThreadState_Delete`, the global interpreter lock need not Like :c:func:`PyThreadState_Delete`, the global interpreter lock need not
be held. The thread state must have been reset with a previous call be held. The thread state must have been reset with a previous call
to :c:func:`PyThreadState_Clear`. to :c:func:`PyThreadState_Clear`.
.. c:function:: PyInterpreterState* PyThreadState_GetInterpreter(PyThreadState *tstate)
Get the interpreter of the Python thread state *tstate*.
*tstate* must not be ``NULL``.
.. versionadded:: 3.9
.. c:function:: PyInterpreterState* PyInterpreterState_Get(void) .. c:function:: PyInterpreterState* PyInterpreterState_Get(void)

View File

@ -406,7 +406,8 @@ Optimizations
Build and C API Changes Build and C API Changes
======================= =======================
* New :c:func:`PyInterpreterState_Get` function. * New :c:func:`PyThreadState_GetInterpreter` and
:c:func:`PyInterpreterState_Get` functions to get the interpreter.
* Add ``--with-platlibdir`` option to the ``configure`` script: name of the * Add ``--with-platlibdir`` option to the ``configure`` script: name of the
platform-specific library directory, stored in the new :attr:`sys.platlibdir` platform-specific library directory, stored in the new :attr:`sys.platlibdir`

View File

@ -87,6 +87,11 @@ PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *);
PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void); PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void);
PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *); PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *);
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
/* New in 3.9 */
PyAPI_FUNC(PyInterpreterState *) PyThreadState_GetInterpreter(PyThreadState *tstate);
#endif
typedef typedef
enum {PyGILState_LOCKED, PyGILState_UNLOCKED} enum {PyGILState_LOCKED, PyGILState_UNLOCKED}
PyGILState_STATE; PyGILState_STATE;

View File

@ -0,0 +1,2 @@
Add :c:func:`PyThreadState_GetInterpreter`: get the interpreter of a Python
thread state.

View File

@ -540,7 +540,7 @@ faulthandler_py_enable(PyObject *self, PyObject *args, PyObject *kwargs)
Py_XSETREF(fatal_error.file, file); Py_XSETREF(fatal_error.file, file);
fatal_error.fd = fd; fatal_error.fd = fd;
fatal_error.all_threads = all_threads; fatal_error.all_threads = all_threads;
fatal_error.interp = tstate->interp; fatal_error.interp = PyThreadState_GetInterpreter(tstate);
if (faulthandler_enable() < 0) { if (faulthandler_enable() < 0) {
return NULL; return NULL;
@ -756,7 +756,7 @@ faulthandler_dump_traceback_later(PyObject *self,
/* the downcast is safe: we check that 0 < timeout_us < PY_TIMEOUT_MAX */ /* the downcast is safe: we check that 0 < timeout_us < PY_TIMEOUT_MAX */
thread.timeout_us = (PY_TIMEOUT_T)timeout_us; thread.timeout_us = (PY_TIMEOUT_T)timeout_us;
thread.repeat = repeat; thread.repeat = repeat;
thread.interp = tstate->interp; thread.interp = PyThreadState_GetInterpreter(tstate);
thread.exit = exit; thread.exit = exit;
thread.header = header; thread.header = header;
thread.header_len = header_len; thread.header_len = header_len;
@ -939,7 +939,7 @@ faulthandler_register_py(PyObject *self,
user->fd = fd; user->fd = fd;
user->all_threads = all_threads; user->all_threads = all_threads;
user->chain = chain; user->chain = chain;
user->interp = tstate->interp; user->interp = PyThreadState_GetInterpreter(tstate);
user->enabled = 1; user->enabled = 1;
Py_RETURN_NONE; Py_RETURN_NONE;

View File

@ -998,6 +998,17 @@ PyThreadState_GetDict(void)
} }
PyInterpreterState *
PyThreadState_GetInterpreter(PyThreadState *tstate)
{
assert(tstate != NULL);
if (tstate == NULL) {
return NULL;
}
return tstate->interp;
}
/* Asynchronously raise an exception in a thread. /* Asynchronously raise an exception in a thread.
Requested by Just van Rossum and Alex Martelli. Requested by Just van Rossum and Alex Martelli.
To prevent naive misuse, you must write your own extension To prevent naive misuse, you must write your own extension