Skip to content

Commit a55df63

Browse files
committed
Include yjit roots
Yjit roots are recently added. We add a new function for MMTk, too. Also reordered the root scanning functions in the upcall table.
1 parent 09a760e commit a55df63

File tree

5 files changed

+38
-29
lines changed

5 files changed

+38
-29
lines changed

Diff for: gc.c

+12
Original file line numberDiff line numberDiff line change
@@ -2516,6 +2516,18 @@ rb_mmtk_scan_global_tbl_roots(void)
25162516
{
25172517
rb_gc_mark_global_tbl();
25182518
}
2519+
2520+
void
2521+
rb_mmtk_scan_yjit_roots(void)
2522+
{
2523+
#if USE_YJIT
2524+
void rb_yjit_root_mark(void); // in Rust
2525+
2526+
if (rb_yjit_enabled_p) {
2527+
rb_yjit_root_mark();
2528+
}
2529+
#endif
2530+
}
25192531
#endif
25202532

25212533
void

Diff for: gc/default.c

+20-26
Original file line numberDiff line numberDiff line change
@@ -3701,26 +3701,6 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr)
37013701
RUBY_ATOMIC_SET(finalizing, 0);
37023702
}
37033703

3704-
#if USE_MMTK
3705-
/* Mark all final jobs. */
3706-
static void
3707-
rb_mmtk_mark_final_jobs(void)
3708-
{
3709-
rb_vm_t *vm = GET_VM();
3710-
3711-
struct MMTk_FinalJob *cur_job = (struct MMTk_FinalJob*)vm->objspace->heap_pages.deferred_final;
3712-
while (cur_job != NULL) {
3713-
if (cur_job->kind == MMTK_FJOB_FINALIZE) {
3714-
// The finalizer array is a proper MMTk heap object, and needs to be kept alive.
3715-
// We treat it as a root. Currently we pin all roots.
3716-
rb_gc_mark(cur_job->as.finalize.finalizer_array);
3717-
}
3718-
3719-
cur_job = cur_job->next;
3720-
}
3721-
}
3722-
#endif
3723-
37243704
void
37253705
rb_gc_impl_each_object(void *objspace_ptr, void (*func)(VALUE obj, void *data), void *data)
37263706
{
@@ -5330,6 +5310,26 @@ rb_mmtk_scan_misc_roots(void)
53305310

53315311
if (stress_to_class) rb_gc_mark(stress_to_class);
53325312
}
5313+
5314+
// When using MMTk, final jobs are roots, too.
5315+
// Specifically, finalizer jobs contain pointers to finalizer arrays
5316+
// which are allocated in the heap.
5317+
void
5318+
rb_mmtk_scan_final_jobs_roots(void)
5319+
{
5320+
rb_vm_t *vm = GET_VM();
5321+
5322+
struct MMTk_FinalJob *cur_job = (struct MMTk_FinalJob*)vm->objspace->heap_pages.deferred_final;
5323+
while (cur_job != NULL) {
5324+
if (cur_job->kind == MMTK_FJOB_FINALIZE) {
5325+
// The finalizer array is a proper MMTk heap object, and needs to be kept alive.
5326+
// We treat it as a root. Currently we pin all roots.
5327+
rb_gc_mark(cur_job->as.finalize.finalizer_array);
5328+
}
5329+
5330+
cur_job = cur_job->next;
5331+
}
5332+
}
53335333
#endif
53345334

53355335
static inline void
@@ -10576,12 +10576,6 @@ rb_mmtk_get_ci_table(void)
1057610576
/////////////// END: Global table updating ////////////////
1057710577

1057810578
// Workaround private functions
10579-
void
10580-
rb_mmtk_scan_final_jobs_roots(void)
10581-
{
10582-
rb_mmtk_mark_final_jobs();
10583-
}
10584-
1058510579
void
1058610580
rb_mmtk_mark_children(VALUE obj)
1058710581
{

Diff for: internal/gc.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,10 @@ void rb_gc_initial_stress_set(VALUE flag);
221221

222222
#if USE_MMTK
223223
void rb_mmtk_scan_vm_roots(void);
224-
void rb_mmtk_scan_finalizer_tbl_roots(void);
225224
void rb_mmtk_scan_end_proc_roots(void);
226225
void rb_mmtk_scan_global_tbl_roots(void);
226+
void rb_mmtk_scan_yjit_roots(void);
227+
void rb_mmtk_scan_finalizer_tbl_roots(void);
227228
void rb_mmtk_scan_obj_to_id_tbl_roots(void);
228229
void rb_mmtk_scan_misc_roots(void);
229230
void rb_mmtk_scan_final_jobs_roots(void);

Diff for: internal/mmtk.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@ typedef struct MMTk_RubyUpcalls {
6565
size_t (*number_of_mutators)(void);
6666
void (*get_mutators)(void (*visit_mutator)(MMTk_Mutator*, void*), void *data);
6767
void (*scan_vm_roots)(void);
68-
void (*scan_finalizer_tbl_roots)(void);
6968
void (*scan_end_proc_roots)(void);
7069
void (*scan_global_tbl_roots)(void);
70+
void (*scan_yjit_roots)(void);
71+
void (*scan_finalizer_tbl_roots)(void);
7172
void (*scan_obj_to_id_tbl_roots)(void);
7273
void (*scan_misc_roots)(void);
7374
void (*scan_final_jobs_roots)(void);

Diff for: mmtk_support.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -1624,9 +1624,10 @@ MMTk_RubyUpcalls ruby_upcalls = {
16241624
rb_mmtk_number_of_mutators,
16251625
rb_mmtk_get_mutators,
16261626
rb_mmtk_scan_vm_roots,
1627-
rb_mmtk_scan_finalizer_tbl_roots,
16281627
rb_mmtk_scan_end_proc_roots,
16291628
rb_mmtk_scan_global_tbl_roots,
1629+
rb_mmtk_scan_yjit_roots,
1630+
rb_mmtk_scan_finalizer_tbl_roots,
16301631
rb_mmtk_scan_obj_to_id_tbl_roots,
16311632
rb_mmtk_scan_misc_roots,
16321633
rb_mmtk_scan_final_jobs_roots,

0 commit comments

Comments
 (0)