Skip to content

Commit 1828f65

Browse files
committed
Lock the VM when freeing objects in rb_gc_impl_shutdown_call_finalizer
1 parent 4c85c62 commit 1828f65

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

gc/mmtk/mmtk.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,16 +1022,20 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr)
10221022
gc_run_finalizers(objspace);
10231023
}
10241024

1025-
struct MMTk_RawVecOfObjRef registered_candidates = mmtk_get_all_obj_free_candidates();
1026-
for (size_t i = 0; i < registered_candidates.len; i++) {
1027-
VALUE obj = (VALUE)registered_candidates.ptr[i];
1028-
1029-
if (rb_gc_shutdown_call_finalizer_p(obj)) {
1030-
rb_gc_obj_free(objspace_ptr, obj);
1031-
RBASIC(obj)->flags = 0;
1025+
unsigned int lev = RB_GC_VM_LOCK();
1026+
{
1027+
struct MMTk_RawVecOfObjRef registered_candidates = mmtk_get_all_obj_free_candidates();
1028+
for (size_t i = 0; i < registered_candidates.len; i++) {
1029+
VALUE obj = (VALUE)registered_candidates.ptr[i];
1030+
1031+
if (rb_gc_shutdown_call_finalizer_p(obj)) {
1032+
rb_gc_obj_free(objspace_ptr, obj);
1033+
RBASIC(obj)->flags = 0;
1034+
}
10321035
}
1036+
mmtk_free_raw_vec_of_obj_ref(registered_candidates);
10331037
}
1034-
mmtk_free_raw_vec_of_obj_ref(registered_candidates);
1038+
RB_GC_VM_UNLOCK(lev);
10351039

10361040
gc_run_finalizers(objspace);
10371041
}

0 commit comments

Comments
 (0)