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`.
|
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)
|
.. c:function:: PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *interp)
|
||||||
|
|
||||||
Return the interpreter's unique ID. If there was any error in doing
|
Return the interpreter's unique ID. If there was any error in doing
|
||||||
|
@ -406,6 +406,8 @@ Optimizations
|
|||||||
Build and C API Changes
|
Build and C API Changes
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
|
* New :c:func:`PyInterpreterState_Get` function.
|
||||||
|
|
||||||
* 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`
|
||||||
attribute. See :attr:`sys.platlibdir` attribute for more information.
|
attribute. See :attr:`sys.platlibdir` attribute for more information.
|
||||||
|
@ -139,13 +139,8 @@ struct _ts {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Get the current interpreter state.
|
// Alias for backward compatibility with Python 3.8
|
||||||
|
#define _PyInterpreterState_Get PyInterpreterState_Get
|
||||||
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);
|
|
||||||
|
|
||||||
PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *);
|
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_Clear(PyInterpreterState *);
|
||||||
PyAPI_FUNC(void) PyInterpreterState_Delete(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
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000
|
||||||
/* New in 3.8 */
|
/* New in 3.8 */
|
||||||
PyAPI_FUNC(PyObject *) PyInterpreterState_GetDict(PyInterpreterState *);
|
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;
|
return NULL;
|
||||||
|
|
||||||
if ((preexec_fn != Py_None) &&
|
if ((preexec_fn != Py_None) &&
|
||||||
(_PyInterpreterState_Get() != PyInterpreterState_Main())) {
|
(PyInterpreterState_Get() != PyInterpreterState_Main())) {
|
||||||
PyErr_SetString(PyExc_RuntimeError,
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
"preexec_fn not supported within subinterpreters");
|
"preexec_fn not supported within subinterpreters");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -26,9 +26,9 @@ _copy_raw_string(PyObject *strobj)
|
|||||||
static PyInterpreterState *
|
static PyInterpreterState *
|
||||||
_get_current(void)
|
_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.
|
// 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.
|
// Switch to interpreter.
|
||||||
PyThreadState *save_tstate = NULL;
|
PyThreadState *save_tstate = NULL;
|
||||||
if (interp != _PyInterpreterState_Get()) {
|
if (interp != PyInterpreterState_Get()) {
|
||||||
// XXX Using the "head" thread isn't strictly correct.
|
// XXX Using the "head" thread isn't strictly correct.
|
||||||
PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
|
PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
|
||||||
// XXX Possible GILState issues?
|
// XXX Possible GILState issues?
|
||||||
|
@ -396,7 +396,7 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
|
|||||||
|
|
||||||
|
|
||||||
PyInterpreterState *
|
PyInterpreterState *
|
||||||
_PyInterpreterState_Get(void)
|
PyInterpreterState_Get(void)
|
||||||
{
|
{
|
||||||
PyThreadState *tstate = _PyThreadState_GET();
|
PyThreadState *tstate = _PyThreadState_GET();
|
||||||
if (tstate == NULL) {
|
if (tstate == NULL) {
|
||||||
@ -1423,9 +1423,9 @@ _check_xidata(_PyCrossInterpreterData *data)
|
|||||||
int
|
int
|
||||||
_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
|
_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.
|
// to check the result for NULL.
|
||||||
PyInterpreterState *interp = _PyInterpreterState_Get();
|
PyInterpreterState *interp = PyInterpreterState_Get();
|
||||||
|
|
||||||
// Reset data before re-populating.
|
// Reset data before re-populating.
|
||||||
*data = (_PyCrossInterpreterData){0};
|
*data = (_PyCrossInterpreterData){0};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user