Skip to content

Commit

Permalink
Lock finalizers lists at exit (#49931)
Browse files Browse the repository at this point in the history
(cherry picked from commit c470dc3)
  • Loading branch information
kpamnany authored and KristofferC committed Jul 11, 2023
1 parent c984dd8 commit 6d135d6
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -638,12 +638,17 @@ void jl_gc_run_all_finalizers(jl_task_t *ct)
jl_ptls_t* gc_all_tls_states;
gc_n_threads = jl_atomic_load_acquire(&jl_n_threads);
gc_all_tls_states = jl_atomic_load_relaxed(&jl_all_tls_states);
// this is called from `jl_atexit_hook`; threads could still be running
// so we have to guard the finalizers' lists
JL_LOCK_NOGC(&finalizers_lock);
schedule_all_finalizers(&finalizer_list_marked);
for (int i = 0; i < gc_n_threads; i++) {
jl_ptls_t ptls2 = gc_all_tls_states[i];
if (ptls2)
schedule_all_finalizers(&ptls2->finalizers);
}
// unlock here because `run_finalizers` locks this
JL_UNLOCK_NOGC(&finalizers_lock);
gc_n_threads = 0;
gc_all_tls_states = NULL;
run_finalizers(ct);
Expand Down

0 comments on commit 6d135d6

Please sign in to comment.