gh-120321: Make gen.gi_frame.clear() thread-safe (gh-143112) · python/cpython@e2f15ae · GitHub
Skip to content

Commit e2f15ae

Browse files
authored
gh-120321: Make gen.gi_frame.clear() thread-safe (gh-143112)
1 parent aeb3403 commit e2f15ae

3 files changed

Lines changed: 39 additions & 21 deletions

File tree

Include/internal/pycore_genobject.h

Lines changed: 1 addition & 1 deletion

Objects/frameobject.c

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2015,30 +2015,20 @@ frame_clear_impl(PyFrameObject *self)
20152015
{
20162016
if (self->f_frame->owner == FRAME_OWNED_BY_GENERATOR) {
20172017
PyGenObject *gen = _PyGen_GetGeneratorFromFrame(self->f_frame);
2018-
if (gen->gi_frame_state == FRAME_EXECUTING) {
2019-
goto running;
2020-
}
2021-
if (FRAME_STATE_SUSPENDED(gen->gi_frame_state)) {
2022-
goto suspended;
2018+
if (_PyGen_ClearFrame(gen) < 0) {
2019+
return NULL;
20232020
}
2024-
_PyGen_Finalize((PyObject *)gen);
20252021
}
20262022
else if (self->f_frame->owner == FRAME_OWNED_BY_THREAD) {
2027-
goto running;
2023+
PyErr_SetString(PyExc_RuntimeError,
2024+
"cannot clear an executing frame");
2025+
return NULL;
20282026
}
20292027
else {
20302028
assert(self->f_frame->owner == FRAME_OWNED_BY_FRAME_OBJECT);
20312029
(void)frame_tp_clear((PyObject *)self);
20322030
}
20332031
Py_RETURN_NONE;
2034-
running:
2035-
PyErr_SetString(PyExc_RuntimeError,
2036-
"cannot clear an executing frame");
2037-
return NULL;
2038-
suspended:
2039-
PyErr_SetString(PyExc_RuntimeError,
2040-
"cannot clear a suspended frame");
2041-
return NULL;
20422032
}
20432033

20442034
/*[clinic input]

Objects/genobject.c

Lines changed: 33 additions & 5 deletions

0 commit comments

Comments
 (0)