mirror of
https://github.com/python/cpython.git
synced 2025-12-31 04:23:37 +00:00
gh-76785: Drop PyInterpreterID_Type (gh-117101)
I added it quite a while ago as a strategy for managing interpreter lifetimes relative to the PEP 554 (now 734) implementation. Relatively recently I refactored that implementation to no longer rely on InterpreterID objects. Thus now I'm removing it.
This commit is contained in:
parent
abdd1f938f
commit
617158e078
18 changed files with 357 additions and 443 deletions
|
|
@ -19,3 +19,20 @@ clear_xid_class(PyTypeObject *cls)
|
|||
return _PyCrossInterpreterData_UnregisterClass(cls);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef RETURNS_INTERPID_OBJECT
|
||||
static PyObject *
|
||||
get_interpid_obj(PyInterpreterState *interp)
|
||||
{
|
||||
if (_PyInterpreterState_IDInitref(interp) != 0) {
|
||||
return NULL;
|
||||
};
|
||||
int64_t id = PyInterpreterState_GetID(interp);
|
||||
if (id < 0) {
|
||||
return NULL;
|
||||
}
|
||||
assert(id < LLONG_MAX);
|
||||
return PyLong_FromLongLong(id);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@
|
|||
#include "_testcapi/parts.h"
|
||||
|
||||
#include "frameobject.h" // PyFrame_New()
|
||||
#include "interpreteridobject.h" // PyInterpreterID_Type
|
||||
#include "marshal.h" // PyMarshal_WriteLongToFile()
|
||||
|
||||
#include <float.h> // FLT_MAX
|
||||
|
|
@ -1449,12 +1448,6 @@ run_in_subinterp(PyObject *self, PyObject *args)
|
|||
return PyLong_FromLong(r);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
get_interpreterid_type(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
return Py_NewRef(&PyInterpreterID_Type);
|
||||
}
|
||||
|
||||
static PyMethodDef ml;
|
||||
|
||||
static PyObject *
|
||||
|
|
@ -3299,7 +3292,6 @@ static PyMethodDef TestMethods[] = {
|
|||
{"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
|
||||
{"test_current_tstate_matches", test_current_tstate_matches, METH_NOARGS},
|
||||
{"run_in_subinterp", run_in_subinterp, METH_VARARGS},
|
||||
{"get_interpreterid_type", get_interpreterid_type, METH_NOARGS},
|
||||
{"create_cfunction", create_cfunction, METH_NOARGS},
|
||||
{"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_VARARGS,
|
||||
PyDoc_STR("set_error_class(error_class) -> None")},
|
||||
|
|
|
|||
|
|
@ -1475,6 +1475,83 @@ run_in_subinterp_with_config(PyObject *self, PyObject *args, PyObject *kwargs)
|
|||
}
|
||||
|
||||
|
||||
static PyObject *
|
||||
normalize_interp_id(PyObject *self, PyObject *idobj)
|
||||
{
|
||||
int64_t interpid = _PyInterpreterState_ObjectToID(idobj);
|
||||
if (interpid < 0) {
|
||||
return NULL;
|
||||
}
|
||||
return PyLong_FromLongLong(interpid);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
unused_interpreter_id(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
int64_t interpid = INT64_MAX;
|
||||
assert(interpid > _PyRuntime.interpreters.next_id);
|
||||
return PyLong_FromLongLong(interpid);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
new_interpreter(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
// Unlike _interpreters.create(), we do not automatically link
|
||||
// the interpreter to its refcount.
|
||||
PyThreadState *save_tstate = PyThreadState_Get();
|
||||
const PyInterpreterConfig config = \
|
||||
(PyInterpreterConfig)_PyInterpreterConfig_INIT;
|
||||
PyThreadState *tstate = NULL;
|
||||
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
|
||||
PyThreadState_Swap(save_tstate);
|
||||
if (PyStatus_Exception(status)) {
|
||||
_PyErr_SetFromPyStatus(status);
|
||||
return NULL;
|
||||
}
|
||||
PyInterpreterState *interp = PyThreadState_GetInterpreter(tstate);
|
||||
|
||||
if (_PyInterpreterState_IDInitref(interp) < 0) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
int64_t interpid = PyInterpreterState_GetID(interp);
|
||||
if (interpid < 0) {
|
||||
goto error;
|
||||
}
|
||||
PyObject *idobj = PyLong_FromLongLong(interpid);
|
||||
if (idobj == NULL) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
PyThreadState_Swap(tstate);
|
||||
PyThreadState_Clear(tstate);
|
||||
PyThreadState_Swap(save_tstate);
|
||||
PyThreadState_Delete(tstate);
|
||||
|
||||
return idobj;
|
||||
|
||||
error:
|
||||
save_tstate = PyThreadState_Swap(tstate);
|
||||
Py_EndInterpreter(tstate);
|
||||
PyThreadState_Swap(save_tstate);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
interpreter_exists(PyObject *self, PyObject *idobj)
|
||||
{
|
||||
PyInterpreterState *interp = _PyInterpreterState_LookUpIDObject(idobj);
|
||||
if (interp == NULL) {
|
||||
if (PyErr_ExceptionMatches(PyExc_InterpreterNotFoundError)) {
|
||||
PyErr_Clear();
|
||||
Py_RETURN_FALSE;
|
||||
}
|
||||
assert(PyErr_Occurred());
|
||||
return NULL;
|
||||
}
|
||||
Py_RETURN_TRUE;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
get_interpreter_refcount(PyObject *self, PyObject *idobj)
|
||||
{
|
||||
|
|
@ -1509,6 +1586,41 @@ unlink_interpreter_refcount(PyObject *self, PyObject *idobj)
|
|||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
interpreter_refcount_linked(PyObject *self, PyObject *idobj)
|
||||
{
|
||||
PyInterpreterState *interp = _PyInterpreterState_LookUpIDObject(idobj);
|
||||
if (interp == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (_PyInterpreterState_RequiresIDRef(interp)) {
|
||||
Py_RETURN_TRUE;
|
||||
}
|
||||
Py_RETURN_FALSE;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
interpreter_incref(PyObject *self, PyObject *idobj)
|
||||
{
|
||||
PyInterpreterState *interp = _PyInterpreterState_LookUpIDObject(idobj);
|
||||
if (interp == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
_PyInterpreterState_IDIncref(interp);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
interpreter_decref(PyObject *self, PyObject *idobj)
|
||||
{
|
||||
PyInterpreterState *interp = _PyInterpreterState_LookUpIDObject(idobj);
|
||||
if (interp == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
_PyInterpreterState_IDDecref(interp);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
_xid_capsule_destructor(PyObject *capsule)
|
||||
|
|
@ -1749,9 +1861,16 @@ static PyMethodDef module_functions[] = {
|
|||
{"run_in_subinterp_with_config",
|
||||
_PyCFunction_CAST(run_in_subinterp_with_config),
|
||||
METH_VARARGS | METH_KEYWORDS},
|
||||
{"normalize_interp_id", normalize_interp_id, METH_O},
|
||||
{"unused_interpreter_id", unused_interpreter_id, METH_NOARGS},
|
||||
{"new_interpreter", new_interpreter, METH_NOARGS},
|
||||
{"interpreter_exists", interpreter_exists, METH_O},
|
||||
{"get_interpreter_refcount", get_interpreter_refcount, METH_O},
|
||||
{"link_interpreter_refcount", link_interpreter_refcount, METH_O},
|
||||
{"unlink_interpreter_refcount", unlink_interpreter_refcount, METH_O},
|
||||
{"interpreter_refcount_linked", interpreter_refcount_linked, METH_O},
|
||||
{"interpreter_incref", interpreter_incref, METH_O},
|
||||
{"interpreter_decref", interpreter_decref, METH_O},
|
||||
{"compile_perf_trampoline_entry", compile_perf_trampoline_entry, METH_VARARGS},
|
||||
{"perf_trampoline_set_persist_after_fork", perf_trampoline_set_persist_after_fork, METH_VARARGS},
|
||||
{"get_crossinterp_data", get_crossinterp_data, METH_VARARGS},
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
#endif
|
||||
|
||||
#include "Python.h"
|
||||
#include "interpreteridobject.h"
|
||||
#include "pycore_crossinterp.h" // struct _xid
|
||||
#include "pycore_interp.h" // _PyInterpreterState_LookUpID()
|
||||
|
||||
|
|
@ -18,7 +17,9 @@
|
|||
#endif
|
||||
|
||||
#define REGISTERS_HEAP_TYPES
|
||||
#define RETURNS_INTERPID_OBJECT
|
||||
#include "_interpreters_common.h"
|
||||
#undef RETURNS_INTERPID_OBJECT
|
||||
#undef REGISTERS_HEAP_TYPES
|
||||
|
||||
|
||||
|
|
@ -2908,7 +2909,7 @@ channelsmod_list_interpreters(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
goto except;
|
||||
}
|
||||
if (res) {
|
||||
interpid_obj = PyInterpreterState_GetIDObject(interp);
|
||||
interpid_obj = get_interpid_obj(interp);
|
||||
if (interpid_obj == NULL) {
|
||||
goto except;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,10 +16,11 @@
|
|||
#include "pycore_pyerrors.h" // _Py_excinfo
|
||||
#include "pycore_pystate.h" // _PyInterpreterState_SetRunningMain()
|
||||
|
||||
#include "interpreteridobject.h"
|
||||
#include "marshal.h" // PyMarshal_ReadObjectFromString()
|
||||
|
||||
#define RETURNS_INTERPID_OBJECT
|
||||
#include "_interpreters_common.h"
|
||||
#undef RETURNS_INTERPID_OBJECT
|
||||
|
||||
|
||||
#define MODULE_NAME _xxsubinterpreters
|
||||
|
|
@ -38,20 +39,6 @@ _get_current_interp(void)
|
|||
#define look_up_interp _PyInterpreterState_LookUpIDObject
|
||||
|
||||
|
||||
static PyObject *
|
||||
get_interpid_obj(PyInterpreterState *interp)
|
||||
{
|
||||
if (_PyInterpreterState_IDInitref(interp) != 0) {
|
||||
return NULL;
|
||||
};
|
||||
int64_t id = PyInterpreterState_GetID(interp);
|
||||
if (id < 0) {
|
||||
return NULL;
|
||||
}
|
||||
assert(id < LLONG_MAX);
|
||||
return PyLong_FromLongLong(id);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
_get_current_module(void)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue