Skip to content

Commit 922f22a

Browse files
committed
Fix object ID for finalizers
We should get the object ID for finalizers in rb_gc_impl_define_finalizer instead of when we create the finalizer job in make_final_job because when we are in multi-Ractor mode, object ID needs to walk the references which allocates an identity hash table. We cannot allocate in make_final_job because it is in a MMTk worker thread.
1 parent 447eced commit 922f22a

File tree

1 file changed

+5
-9
lines changed

1 file changed

+5
-9
lines changed

gc/mmtk/mmtk.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct MMTk_final_job {
5959
void *data;
6060
} dfree;
6161
struct {
62-
VALUE object_id;
62+
/* HACK: we store the object ID on the 0th element of this array. */
6363
VALUE finalizer_array;
6464
} finalize;
6565
} as;
@@ -229,7 +229,6 @@ rb_mmtk_scan_objspace(void)
229229
case MMTK_FINAL_JOB_DFREE:
230230
break;
231231
case MMTK_FINAL_JOB_FINALIZE:
232-
rb_gc_impl_mark(objspace, job->as.finalize.object_id);
233232
rb_gc_impl_mark(objspace, job->as.finalize.finalizer_array);
234233
break;
235234
default:
@@ -285,7 +284,6 @@ make_final_job(struct objspace *objspace, VALUE obj, VALUE table)
285284
struct MMTk_final_job *job = xmalloc(sizeof(struct MMTk_final_job));
286285
job->next = objspace->finalizer_jobs;
287286
job->kind = MMTK_FINAL_JOB_FINALIZE;
288-
job->as.finalize.object_id = rb_obj_id((VALUE)obj);
289287
job->as.finalize.finalizer_array = table;
290288

291289
objspace->finalizer_jobs = job;
@@ -855,7 +853,7 @@ gc_run_finalizers_get_final(long i, void *data)
855853
{
856854
VALUE table = (VALUE)data;
857855

858-
return RARRAY_AREF(table, i);
856+
return RARRAY_AREF(table, i + 1);
859857
}
860858

861859
static void
@@ -874,17 +872,15 @@ gc_run_finalizers(void *data)
874872
job->as.dfree.func(job->as.dfree.data);
875873
break;
876874
case MMTK_FINAL_JOB_FINALIZE: {
877-
VALUE object_id = job->as.finalize.object_id;
878875
VALUE finalizer_array = job->as.finalize.finalizer_array;
879876

880877
rb_gc_run_obj_finalizer(
881-
job->as.finalize.object_id,
882-
RARRAY_LEN(finalizer_array),
878+
RARRAY_AREF(finalizer_array, 0),
879+
RARRAY_LEN(finalizer_array) - 1,
883880
gc_run_finalizers_get_final,
884881
(void *)finalizer_array
885882
);
886883

887-
RB_GC_GUARD(object_id);
888884
RB_GC_GUARD(finalizer_array);
889885
break;
890886
}
@@ -950,7 +946,7 @@ rb_gc_impl_define_finalizer(void *objspace_ptr, VALUE obj, VALUE block)
950946
rb_ary_push(table, block);
951947
}
952948
else {
953-
table = rb_ary_new3(1, block);
949+
table = rb_ary_new3(2, block);
954950
rb_obj_hide(table);
955951
st_add_direct(objspace->finalizer_table, obj, table);
956952
}

0 commit comments

Comments
 (0)