mirror of
https://github.com/python/cpython.git
synced 2025-07-09 20:35:26 +00:00
gh-99741: Clean Up the _xxsubinterpreters Module (gh-99940)
This cleanup up resolves a few subtle bugs and makes the implementation for multi-phase init much cleaner. https://github.com/python/cpython/issues/99741
This commit is contained in:
parent
ab02262cd0
commit
0547a981ae
4 changed files with 659 additions and 317 deletions
|
@ -1865,7 +1865,7 @@ _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
|
|||
// Fill in the blanks and validate the result.
|
||||
data->interp = interp->id;
|
||||
if (_check_xidata(tstate, data) != 0) {
|
||||
_PyCrossInterpreterData_Release(data);
|
||||
(void)_PyCrossInterpreterData_Release(data);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1878,8 +1878,8 @@ _release_xidata(void *arg)
|
|||
_PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
|
||||
if (data->free != NULL) {
|
||||
data->free(data->data);
|
||||
data->data = NULL;
|
||||
}
|
||||
data->data = NULL;
|
||||
Py_CLEAR(data->obj);
|
||||
}
|
||||
|
||||
|
@ -1910,27 +1910,29 @@ _call_in_interpreter(struct _gilstate_runtime_state *gilstate,
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
|
||||
{
|
||||
if (data->data == NULL && data->obj == NULL) {
|
||||
if (data->free == NULL && data->obj == NULL) {
|
||||
// Nothing to release!
|
||||
return;
|
||||
data->data = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Switch to the original interpreter.
|
||||
PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
|
||||
if (interp == NULL) {
|
||||
// The interpreter was already destroyed.
|
||||
if (data->free != NULL) {
|
||||
// XXX Someone leaked some memory...
|
||||
}
|
||||
return;
|
||||
// This function shouldn't have been called.
|
||||
// XXX Someone leaked some memory...
|
||||
assert(PyErr_Occurred());
|
||||
return -1;
|
||||
}
|
||||
|
||||
// "Release" the data and/or the object.
|
||||
struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
|
||||
_call_in_interpreter(gilstate, interp, _release_xidata, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
PyObject *
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue