bpo-39947: Add PyThreadState_GetInterpreter() (GH-18981)
Add PyThreadState_GetInterpreter(tstate): get the interpreter of a Python thread state.
This commit is contained in:
parent
be79373a78
commit
8fb02b6e19
|
@ -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)
|
||||||
|
|
|
@ -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`
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add :c:func:`PyThreadState_GetInterpreter`: get the interpreter of a Python
|
||||||
|
thread state.
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue