bpo-39947: Add PyInterpreterState_Get() function (GH-18979)
* Rename _PyInterpreterState_Get() to PyInterpreterState_Get() and move it the limited C API. * Add _PyInterpreterState_Get() alias to PyInterpreterState_Get() for backward compatibility with Python 3.8.
This commit is contained in:
parent
ff4584caca
commit
be79373a78
|
@ -1072,6 +1072,18 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
|
|||
to :c:func:`PyThreadState_Clear`.
|
||||
|
||||
|
||||
.. c:function:: PyInterpreterState* PyInterpreterState_Get(void)
|
||||
|
||||
Get the current interpreter.
|
||||
|
||||
Issue a fatal error if there no current Python thread state or no current
|
||||
interpreter. It cannot return NULL.
|
||||
|
||||
The caller must hold the GIL.
|
||||
|
||||
.. versionadded:: 3.9
|
||||
|
||||
|
||||
.. c:function:: PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *interp)
|
||||
|
||||
Return the interpreter's unique ID. If there was any error in doing
|
||||
|
|
|
@ -406,6 +406,8 @@ Optimizations
|
|||
Build and C API Changes
|
||||
=======================
|
||||
|
||||
* New :c:func:`PyInterpreterState_Get` function.
|
||||
|
||||
* Add ``--with-platlibdir`` option to the ``configure`` script: name of the
|
||||
platform-specific library directory, stored in the new :attr:`sys.platlibdir`
|
||||
attribute. See :attr:`sys.platlibdir` attribute for more information.
|
||||
|
|
|
@ -139,13 +139,8 @@ struct _ts {
|
|||
|
||||
};
|
||||
|
||||
/* Get the current interpreter state.
|
||||
|
||||
Issue a fatal error if there no current Python thread state or no current
|
||||
interpreter. It cannot return NULL.
|
||||
|
||||
The caller must hold the GIL.*/
|
||||
PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_Get(void);
|
||||
// Alias for backward compatibility with Python 3.8
|
||||
#define _PyInterpreterState_Get PyInterpreterState_Get
|
||||
|
||||
PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *);
|
||||
|
||||
|
|
|
@ -28,6 +28,17 @@ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
|
|||
PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
|
||||
PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
|
||||
|
||||
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
|
||||
/* New in 3.9 */
|
||||
/* Get the current interpreter state.
|
||||
|
||||
Issue a fatal error if there no current Python thread state or no current
|
||||
interpreter. It cannot return NULL.
|
||||
|
||||
The caller must hold the GIL. */
|
||||
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Get(void);
|
||||
#endif
|
||||
|
||||
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000
|
||||
/* New in 3.8 */
|
||||
PyAPI_FUNC(PyObject *) PyInterpreterState_GetDict(PyInterpreterState *);
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Add :c:func:`PyInterpreterState_Get` function to the limited C API.
|
|
@ -635,7 +635,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
|
|||
return NULL;
|
||||
|
||||
if ((preexec_fn != Py_None) &&
|
||||
(_PyInterpreterState_Get() != PyInterpreterState_Main())) {
|
||||
(PyInterpreterState_Get() != PyInterpreterState_Main())) {
|
||||
PyErr_SetString(PyExc_RuntimeError,
|
||||
"preexec_fn not supported within subinterpreters");
|
||||
return NULL;
|
||||
|
|
|
@ -26,9 +26,9 @@ _copy_raw_string(PyObject *strobj)
|
|||
static PyInterpreterState *
|
||||
_get_current(void)
|
||||
{
|
||||
// _PyInterpreterState_Get() aborts if lookup fails, so don't need
|
||||
// PyInterpreterState_Get() aborts if lookup fails, so don't need
|
||||
// to check the result for NULL.
|
||||
return _PyInterpreterState_Get();
|
||||
return PyInterpreterState_Get();
|
||||
}
|
||||
|
||||
|
||||
|
@ -1928,7 +1928,7 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr,
|
|||
|
||||
// Switch to interpreter.
|
||||
PyThreadState *save_tstate = NULL;
|
||||
if (interp != _PyInterpreterState_Get()) {
|
||||
if (interp != PyInterpreterState_Get()) {
|
||||
// XXX Using the "head" thread isn't strictly correct.
|
||||
PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
|
||||
// XXX Possible GILState issues?
|
||||
|
|
|
@ -396,7 +396,7 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
|
|||
|
||||
|
||||
PyInterpreterState *
|
||||
_PyInterpreterState_Get(void)
|
||||
PyInterpreterState_Get(void)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
if (tstate == NULL) {
|
||||
|
@ -1423,9 +1423,9 @@ _check_xidata(_PyCrossInterpreterData *data)
|
|||
int
|
||||
_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
|
||||
{
|
||||
// _PyInterpreterState_Get() aborts if lookup fails, so we don't need
|
||||
// PyInterpreterState_Get() aborts if lookup fails, so we don't need
|
||||
// to check the result for NULL.
|
||||
PyInterpreterState *interp = _PyInterpreterState_Get();
|
||||
PyInterpreterState *interp = PyInterpreterState_Get();
|
||||
|
||||
// Reset data before re-populating.
|
||||
*data = (_PyCrossInterpreterData){0};
|
||||
|
|
Loading…
Reference in New Issue