@@ -7315,6 +7315,11 @@ rb_gc_remove_weak(VALUE parent_obj, VALUE *ptr)
7315
7315
static inline void
7316
7316
gc_mark_set_parent (rb_objspace_t * objspace , VALUE obj )
7317
7317
{
7318
+ WHEN_USING_MMTK ({
7319
+ // MMTk scans object concurrently. This function only adds one more source of data race.
7320
+ return ;
7321
+ })
7322
+
7318
7323
if (RVALUE_OLD_P (obj )) {
7319
7324
objspace -> rgengc .parent_object = obj ;
7320
7325
}
@@ -7670,7 +7675,17 @@ gc_mark_roots(rb_objspace_t *objspace, const char **categoryp)
7670
7675
#if USE_MMTK
7671
7676
const bool mmtk_enabled_local = rb_mmtk_enabled_p (); // Allows control-flow sensitive analysis of ec etc
7672
7677
if (mmtk_enabled_local ) {
7673
- rb_mmtk_assert_mmtk_worker ();
7678
+ if (GET_RACTOR ()-> mfd == NULL ) {
7679
+ // When using MMTk, we don't directly call `gc_mark_roots` for scanning roots.
7680
+ // Instead, we split this function into multiple functions named `rb_mmtk_scan_*_roots`
7681
+ // so that they can be paralleled by calling them from different work packets.
7682
+ rb_bug ("gc_mark_roots should not be called when using MMTk." );
7683
+ } else {
7684
+ // We still call `gc_mark_roots` when enumerating objects reachable from roots.
7685
+ // In this case, this function will be called from mutator.
7686
+ rb_mmtk_assert_mutator ();
7687
+ }
7688
+
7674
7689
vm = GET_VM ();
7675
7690
} else {
7676
7691
#endif
@@ -7759,6 +7774,57 @@ gc_mark_roots(rb_objspace_t *objspace, const char **categoryp)
7759
7774
#undef MARK_CHECKPOINT
7760
7775
}
7761
7776
7777
+ #if USE_MMTK
7778
+ void
7779
+ rb_mmtk_scan_vm_roots (void )
7780
+ {
7781
+ rb_vm_t * vm = GET_VM ();
7782
+ rb_objspace_t * objspace = vm -> objspace ;
7783
+
7784
+ rb_vm_mark (vm );
7785
+ if (vm -> self ) gc_mark (objspace , vm -> self );
7786
+ }
7787
+
7788
+ void
7789
+ rb_mmtk_scan_finalizer_tbl_roots (void )
7790
+ {
7791
+ rb_vm_t * vm = GET_VM ();
7792
+ rb_objspace_t * objspace = vm -> objspace ;
7793
+
7794
+ mark_finalizer_tbl (objspace , finalizer_table );
7795
+ }
7796
+
7797
+ void
7798
+ rb_mmtk_scan_end_proc_roots (void )
7799
+ {
7800
+ rb_mark_end_proc ();
7801
+ }
7802
+
7803
+ void
7804
+ rb_mmtk_scan_global_tbl_roots (void )
7805
+ {
7806
+ rb_gc_mark_global_tbl ();
7807
+ }
7808
+
7809
+ void
7810
+ rb_mmtk_scan_obj_to_id_tbl_roots (void )
7811
+ {
7812
+ rb_vm_t * vm = GET_VM ();
7813
+ rb_objspace_t * objspace = vm -> objspace ;
7814
+
7815
+ mark_tbl_no_pin (objspace , objspace -> obj_to_id_tbl ); /* Only mark ids */
7816
+ }
7817
+
7818
+ void
7819
+ rb_mmtk_scan_misc_roots (void )
7820
+ {
7821
+ rb_vm_t * vm = GET_VM ();
7822
+ rb_objspace_t * objspace = vm -> objspace ;
7823
+
7824
+ if (stress_to_class ) rb_gc_mark (stress_to_class );
7825
+ }
7826
+ #endif
7827
+
7762
7828
#if RGENGC_CHECK_MODE >= 4
7763
7829
7764
7830
#define MAKE_ROOTSIG (obj ) (((VALUE)(obj) << 1) | 0x01)
@@ -14778,11 +14844,8 @@ rb_mmtk_update_ci_table(void)
14778
14844
14779
14845
// Workaround private functions
14780
14846
void
14781
- rb_mmtk_mark_roots (void )
14847
+ rb_mmtk_scan_final_jobs_roots (void )
14782
14848
{
14783
- rb_vm_t * vm = GET_VM ();
14784
- const char * phase ;
14785
- gc_mark_roots (vm -> objspace , & phase );
14786
14849
rb_mmtk_mark_final_jobs ();
14787
14850
}
14788
14851
0 commit comments