mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
GH-118093: Remove invalidated executors from side exits (GH-121885)
This commit is contained in:
parent
e9681211b9
commit
794546fd53
4 changed files with 27 additions and 28 deletions
|
@ -1587,42 +1587,36 @@ _Py_Executors_InvalidateDependency(PyInterpreterState *interp, void *obj, int is
|
|||
_Py_BloomFilter_Add(&obj_filter, obj);
|
||||
/* Walk the list of executors */
|
||||
/* TO DO -- Use a tree to avoid traversing as many objects */
|
||||
bool no_memory = false;
|
||||
PyObject *invalidate = PyList_New(0);
|
||||
if (invalidate == NULL) {
|
||||
PyErr_Clear();
|
||||
no_memory = true;
|
||||
goto error;
|
||||
}
|
||||
/* Clearing an executor can deallocate others, so we need to make a list of
|
||||
* executors to invalidate first */
|
||||
for (_PyExecutorObject *exec = interp->executor_list_head; exec != NULL;) {
|
||||
assert(exec->vm_data.valid);
|
||||
_PyExecutorObject *next = exec->vm_data.links.next;
|
||||
if (bloom_filter_may_contain(&exec->vm_data.bloom, &obj_filter)) {
|
||||
unlink_executor(exec);
|
||||
if (no_memory) {
|
||||
exec->vm_data.valid = 0;
|
||||
} else {
|
||||
if (PyList_Append(invalidate, (PyObject *)exec) < 0) {
|
||||
PyErr_Clear();
|
||||
no_memory = true;
|
||||
exec->vm_data.valid = 0;
|
||||
}
|
||||
}
|
||||
if (is_invalidation) {
|
||||
OPT_STAT_INC(executors_invalidated);
|
||||
}
|
||||
if (bloom_filter_may_contain(&exec->vm_data.bloom, &obj_filter) &&
|
||||
PyList_Append(invalidate, (PyObject *)exec))
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
exec = next;
|
||||
}
|
||||
if (invalidate != NULL) {
|
||||
for (Py_ssize_t i = 0; i < PyList_GET_SIZE(invalidate); i++) {
|
||||
_PyExecutorObject *exec = (_PyExecutorObject *)PyList_GET_ITEM(invalidate, i);
|
||||
executor_clear(exec);
|
||||
for (Py_ssize_t i = 0; i < PyList_GET_SIZE(invalidate); i++) {
|
||||
_PyExecutorObject *exec = (_PyExecutorObject *)PyList_GET_ITEM(invalidate, i);
|
||||
executor_clear(exec);
|
||||
if (is_invalidation) {
|
||||
OPT_STAT_INC(executors_invalidated);
|
||||
}
|
||||
Py_DECREF(invalidate);
|
||||
}
|
||||
Py_DECREF(invalidate);
|
||||
return;
|
||||
error:
|
||||
PyErr_Clear();
|
||||
Py_XDECREF(invalidate);
|
||||
// If we're truly out of memory, wiping out everything is a fine fallback:
|
||||
_Py_Executors_InvalidateAll(interp, is_invalidation);
|
||||
}
|
||||
|
||||
/* Invalidate all executors */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue