mirror of
https://github.com/python/cpython.git
synced 2025-07-19 17:25:54 +00:00
gh-76785: Improved Subinterpreters Compatibility with 3.12 (1/2) (gh-126704)
These changes makes it easier to backport the _interpreters, _interpqueues, and _interpchannels modules to Python 3.12. This involves the following: * rename several structs and typedefs * add several typedefs * stop using the PyThreadState.state field directly in parking_lot.c
This commit is contained in:
parent
036930d844
commit
a6d48e8f83
9 changed files with 55 additions and 43 deletions
|
@ -126,7 +126,7 @@ void
|
|||
_PyXIData_Init(_PyXIData_t *data,
|
||||
PyInterpreterState *interp,
|
||||
void *shared, PyObject *obj,
|
||||
xid_newobjectfunc new_object)
|
||||
xid_newobjfunc new_object)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(new_object != NULL);
|
||||
|
@ -150,7 +150,7 @@ int
|
|||
_PyXIData_InitWithSize(_PyXIData_t *data,
|
||||
PyInterpreterState *interp,
|
||||
const size_t size, PyObject *obj,
|
||||
xid_newobjectfunc new_object)
|
||||
xid_newobjfunc new_object)
|
||||
{
|
||||
assert(size > 0);
|
||||
// For now we always free the shared data in the same interpreter
|
||||
|
@ -202,11 +202,9 @@ _check_xidata(PyThreadState *tstate, _PyXIData_t *data)
|
|||
}
|
||||
|
||||
static inline void
|
||||
_set_xid_lookup_failure(PyInterpreterState *interp,
|
||||
PyObject *obj, const char *msg)
|
||||
_set_xid_lookup_failure(_PyXI_state_t *state, PyObject *obj, const char *msg)
|
||||
{
|
||||
exceptions_t *state = &_PyInterpreterState_GetXIState(interp)->exceptions;
|
||||
PyObject *exctype = state->PyExc_NotShareableError;
|
||||
PyObject *exctype = state->exceptions.PyExc_NotShareableError;
|
||||
assert(exctype != NULL);
|
||||
if (msg != NULL) {
|
||||
assert(obj == NULL);
|
||||
|
@ -226,10 +224,11 @@ int
|
|||
_PyObject_CheckXIData(PyObject *obj)
|
||||
{
|
||||
PyInterpreterState *interp = PyInterpreterState_Get();
|
||||
_PyXI_state_t *state = _PyXI_GET_STATE(interp);
|
||||
xidatafunc getdata = lookup_getdata(interp, obj);
|
||||
if (getdata == NULL) {
|
||||
if (!PyErr_Occurred()) {
|
||||
_set_xid_lookup_failure(interp, obj, NULL);
|
||||
_set_xid_lookup_failure(state, obj, NULL);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -241,6 +240,7 @@ _PyObject_GetXIData(PyObject *obj, _PyXIData_t *data)
|
|||
{
|
||||
PyThreadState *tstate = PyThreadState_Get();
|
||||
PyInterpreterState *interp = tstate->interp;
|
||||
_PyXI_state_t *state = _PyXI_GET_STATE(interp);
|
||||
|
||||
// Reset data before re-populating.
|
||||
*data = (_PyXIData_t){0};
|
||||
|
@ -252,7 +252,7 @@ _PyObject_GetXIData(PyObject *obj, _PyXIData_t *data)
|
|||
if (getdata == NULL) {
|
||||
Py_DECREF(obj);
|
||||
if (!PyErr_Occurred()) {
|
||||
_set_xid_lookup_failure(interp, obj, NULL);
|
||||
_set_xid_lookup_failure(state, obj, NULL);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -969,6 +969,7 @@ _PyXI_ClearExcInfo(_PyXI_excinfo *info)
|
|||
static int
|
||||
_PyXI_ApplyErrorCode(_PyXI_errcode code, PyInterpreterState *interp)
|
||||
{
|
||||
_PyXI_state_t *state;
|
||||
assert(!PyErr_Occurred());
|
||||
switch (code) {
|
||||
case _PyXI_ERR_NO_ERROR: _Py_FALLTHROUGH;
|
||||
|
@ -999,7 +1000,8 @@ _PyXI_ApplyErrorCode(_PyXI_errcode code, PyInterpreterState *interp)
|
|||
"failed to apply namespace to __main__");
|
||||
break;
|
||||
case _PyXI_ERR_NOT_SHAREABLE:
|
||||
_set_xid_lookup_failure(interp, NULL, NULL);
|
||||
state = _PyXI_GET_STATE(interp);
|
||||
_set_xid_lookup_failure(state, NULL, NULL);
|
||||
break;
|
||||
default:
|
||||
#ifdef Py_DEBUG
|
||||
|
@ -1061,7 +1063,8 @@ _PyXI_ApplyError(_PyXI_error *error)
|
|||
}
|
||||
else if (error->code == _PyXI_ERR_NOT_SHAREABLE) {
|
||||
// Propagate the exception directly.
|
||||
_set_xid_lookup_failure(error->interp, NULL, error->uncaught.msg);
|
||||
_PyXI_state_t *state = _PyXI_GET_STATE(error->interp);
|
||||
_set_xid_lookup_failure(state, NULL, error->uncaught.msg);
|
||||
}
|
||||
else {
|
||||
// Raise an exception corresponding to the code.
|
||||
|
@ -1606,9 +1609,9 @@ _propagate_not_shareable_error(_PyXI_session *session)
|
|||
return;
|
||||
}
|
||||
PyInterpreterState *interp = PyInterpreterState_Get();
|
||||
exceptions_t *state = &_PyInterpreterState_GetXIState(interp)->exceptions;
|
||||
assert(state->PyExc_NotShareableError != NULL);
|
||||
if (PyErr_ExceptionMatches(state->PyExc_NotShareableError)) {
|
||||
_PyXI_state_t *state = _PyXI_GET_STATE(interp);
|
||||
assert(state->exceptions.PyExc_NotShareableError != NULL);
|
||||
if (PyErr_ExceptionMatches(state->exceptions.PyExc_NotShareableError)) {
|
||||
// We want to propagate the exception directly.
|
||||
session->_error_override = _PyXI_ERR_NOT_SHAREABLE;
|
||||
session->error_override = &session->_error_override;
|
||||
|
@ -1779,11 +1782,13 @@ _PyXI_Exit(_PyXI_session *session)
|
|||
PyStatus
|
||||
_PyXI_Init(PyInterpreterState *interp)
|
||||
{
|
||||
_PyXI_state_t *state = _PyXI_GET_STATE(interp);
|
||||
|
||||
// Initialize the XID lookup state (e.g. registry).
|
||||
if (_Py_IsMainInterpreter(interp)) {
|
||||
xid_lookup_init(&_PyXI_GET_GLOBAL_STATE(interp)->data_lookup);
|
||||
}
|
||||
xid_lookup_init(&_PyXI_GET_STATE(interp)->data_lookup);
|
||||
xid_lookup_init(&state->data_lookup);
|
||||
|
||||
// Initialize exceptions.(heap types).
|
||||
// See _PyXI_InitTypes() for the static types.
|
||||
|
@ -1801,12 +1806,14 @@ _PyXI_Init(PyInterpreterState *interp)
|
|||
void
|
||||
_PyXI_Fini(PyInterpreterState *interp)
|
||||
{
|
||||
_PyXI_state_t *state = _PyXI_GET_STATE(interp);
|
||||
|
||||
// Finalize exceptions (heap types).
|
||||
// See _PyXI_FiniTypes() for the static types.
|
||||
fini_heap_exctypes(&_PyXI_GET_STATE(interp)->exceptions);
|
||||
|
||||
// Finalize the XID lookup state (e.g. registry).
|
||||
xid_lookup_fini(&_PyXI_GET_STATE(interp)->data_lookup);
|
||||
xid_lookup_fini(&state->data_lookup);
|
||||
if (_Py_IsMainInterpreter(interp)) {
|
||||
xid_lookup_fini(&_PyXI_GET_GLOBAL_STATE(interp)->data_lookup);
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#include "pycore_weakref.h" // _PyWeakref_GET_REF()
|
||||
|
||||
|
||||
typedef struct _xidregistry dlregistry_t;
|
||||
typedef struct _xidregitem dlregitem_t;
|
||||
typedef _PyXIData_registry_t dlregistry_t;
|
||||
typedef _PyXIData_regitem_t dlregitem_t;
|
||||
|
||||
|
||||
// forward
|
||||
|
|
|
@ -221,8 +221,7 @@ _PySemaphore_Wait(_PySemaphore *sema, PyTime_t timeout, int detach)
|
|||
PyThreadState *tstate = NULL;
|
||||
if (detach) {
|
||||
tstate = _PyThreadState_GET();
|
||||
if (tstate && _Py_atomic_load_int_relaxed(&tstate->state) ==
|
||||
_Py_THREAD_ATTACHED) {
|
||||
if (tstate && _PyThreadState_IsAttached(tstate)) {
|
||||
// Only detach if we are attached
|
||||
PyEval_ReleaseThread(tstate);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue