Skip to content

Commit 830a6dc

Browse files
committed
fix bug where a finalizer could be run twice if we end up in gc again after calling jl_gc_run_all_finalizers
1 parent 7c8acce commit 830a6dc

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

src/gc.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -739,14 +739,21 @@ static void run_finalizers(void)
739739
JL_GC_POP();
740740
}
741741

742-
void jl_gc_run_all_finalizers(void)
742+
void schedule_all_finalizers(arraylist_t* flist)
743743
{
744-
for(size_t i=0; i < finalizer_list.len; i+=2) {
745-
jl_value_t *f = (jl_value_t*)finalizer_list.items[i+1];
744+
for(size_t i=0; i < flist->len; i+=2) {
745+
jl_value_t *f = (jl_value_t*)flist->items[i+1];
746746
if (f != HT_NOTFOUND && !jl_is_cpointer(f)) {
747-
schedule_finalization(finalizer_list.items[i], finalizer_list.items[i+1]);
747+
schedule_finalization(flist->items[i], flist->items[i+1]);
748748
}
749749
}
750+
flist->len = 0;
751+
}
752+
753+
void jl_gc_run_all_finalizers(void)
754+
{
755+
schedule_all_finalizers(&finalizer_list);
756+
schedule_all_finalizers(&finalizer_list_marked);
750757
run_finalizers();
751758
}
752759

0 commit comments

Comments
 (0)