Delete from finalizer_table before running finalizer
The finalizer could trigger a GC, which would cause FL_FINALIZE to be out of sync with the finalizer table.
This commit is contained in:
parent
d5bca0668c
commit
950c60623b
6
gc.c
6
gc.c
@ -4304,11 +4304,11 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
|
|||||||
while (list) {
|
while (list) {
|
||||||
struct force_finalize_list *curr = list;
|
struct force_finalize_list *curr = list;
|
||||||
|
|
||||||
FL_UNSET(curr->obj, FL_FINALIZE);
|
|
||||||
run_finalizer(objspace, curr->obj, curr->table);
|
|
||||||
|
|
||||||
st_data_t obj = (st_data_t)curr->obj;
|
st_data_t obj = (st_data_t)curr->obj;
|
||||||
st_delete(finalizer_table, &obj, 0);
|
st_delete(finalizer_table, &obj, 0);
|
||||||
|
FL_UNSET(curr->obj, FL_FINALIZE);
|
||||||
|
|
||||||
|
run_finalizer(objspace, curr->obj, curr->table);
|
||||||
|
|
||||||
list = curr->next;
|
list = curr->next;
|
||||||
xfree(curr);
|
xfree(curr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user